一、ES6的基础语法
1. let / const
ES6中新增的用来创建变量和常量的
let a = 12;a = 13;console.log(a); // 13const b = 12;b = 13; // Uncaught TypeError: Assignment to constant variable. 基于 CONST 创建变量,变量存储的值不能被修改(常量)console.log(b);
let 和 var 的区别
- let 不存在变量提升(当前作用域中,不能在 let 声明前使用变量)
- 同一个作用域中,let 不允许重复声明
- let解决了 typeof 的一个暂时性死区问题
- 全局作用域中,使用 let 声明的变量并没有给 window 加上对应的属性
- let会存在块作用域(除对象以外的大括号都可被看做块级私有作用域)
2. 箭头函数及THIS问题
ES6中新增了创建函数的方式:“箭头函数” 真实项目中是箭头函数和 FUNCTION 这种普通函数混合使用 箭头函数简化了创建函数的代码
// 箭头函数的创建都是函数表达式方式(变量=函数),这种模式下,不存在变量提升,函数只能在创建完成后被执行(也就是创建的代码之后执行)const fn = ([形参]) => {// 函数体 (return)};fn([实参]);// 形参只有一个,小括号可以不加const fn = n => {};// 函数体中只有一句话,并且是 return xxx 的,可以省略大括号和 return 等const fn = n => n * 10;/*function fn(n){return function(m){return m+(++n);}}*/const fn=n=>m=>m+(++n);
箭头函数中没有 ARGUMENTS,但是可以基于剩余运算符获取实参集合,而且 ES6 中是支持给形参设置默认值的
let obj = {};let fn = (context = window, ...args) => {// console.log(arguments); // Uncaught ReferenceError: arguments is not defined 箭头函数中没有 arguments// ...args:剩余运算符(把除第一项外的,其它传递的实参信息都存储到 ARGS 这个数组集合中)console.log(args);};fn(obj, 10, 20, 30); // context:obj arg:[10,20,30]fn(); // context:window arg:[]
箭头函数中没有自己的 THIS,它里面用到的 THIS,都是自己所处上下文中的 THIS(真实项目中,一但涉及THIS 问题,箭头函数慎用)
window.name = "WINDOW";let fn = n => {console.log(this.name);};let obj = {name: 'OBJ',fn: fn};// FN 所处的执行上下文中的 THIS 是 WINDOWfn(10); // this:windowfn.call(obj, 10); // this:window 不是我们预期的 OBJdocument.body.onclick = fn; // this:window 不是我们预期的 BODYobj.fn(10); // this:window
let obj = {name: 'OBJ',fn: function () {// this:obj 普通函数是有自己的 THIS 的let f = () => {console.log(this);};f(); // this:objreturn f;}};let f = obj.fn();f(); // this:obj
真实项目中的一个应用
let obj = {name: 'OBJ',fn: function () {// this:obj// 原本期望的需求是:1S 后把 OBJ 中的 NAME 改为'珠峰'setTimeout(() => {console.log(this); // OBJthis.name = '珠峰';}, 1000);/* setTimeout(function () {console.log(this);// WINODOWthis.name = '珠峰';}, 1000); *//* let _this = this; // 把需要的 THIS 提前用变量存储起来setTimeout(function () {_this.name = '珠峰'; // 需要使用的时候拿出来用即可}, 1000); */}};obj.fn();
二、解构赋值
// 让左侧出现和右侧相同的数据,彼此快速获取到我们需要的内容// 真实项目中最常用的就是对数组和对象的解构赋值/*let obj = {name: '马宾',age: 18,title: '宇宙集团军总司令'};*/// let name = obj.name;// let age = obj.age;// let title = obj.title;// let { name, age, title } = obj;// // console.log(name, age, title);// let ary = ['JS', 'HTML', 'CSS', 'NODEJS', 'MYSQL'];// let js = ary[0];// let html = ary[1];// let [js, html, css, node, mysql] = ary;// // console.log(js, html, css, node, mysql);// 解构赋值:利用数据结构,快速对对象和数组进行取值;(ES6 新增的)// 1. 数组的解构赋值:let ary = [1, 2, 3, 4];// 1.1 顺序解构let [a, b, c, d] = ary; // 等号左边是变量,等号右边是数组,左边的变量要求和你想取的数组中的值位置对应// console.log(a, b, c, d);// 1.2 只取数组中的某一个,如取第三个,前面写两个逗号let [,,e] = ary;// console.log(e);// 1.3 进一步解构: 取 ary2中 'a' 'b'let ary2 = [1, ['a', 'b']];let [f, [g, h]] = ary2;// console.log(g, h);// 1.4 取出第一项和第二项,把剩下的放到一个数组中;let ary3 = [1, 3, 5, 7, 9];let [i, j, ...k] = ary3; // k 的后面不能再解构了,再解构就会报错// console.log(i);// console.log(j);// console.log(k);// 1.5 数组解构时的默认值: 当解构到的值是 undefined 时(解构到的值是 undefined,另一种就是没有解构到值),就会使用默认值let ary4 = [2, 4, 6, undefined];let [l, m, n, o = 'hahaha'] = ary4; // 给 o 设置解构的默认值// console.log(l, m, n, o);// 用p当q的默认值let [p, q = p] = [1];// console.log(p, q);// let [r = s, s] = [undefined, 3]; 报错:当 r 解构出 undefined 时,要使用s的值做默认值,但是 s 没声明过,就会报错;当解构变量互为默认值时,注意!// // console.log(r, s);// 对象的解构赋值// 通常情况下我们使用对象.属性名 或者 对象['属性名'] 取得该属性名对应的属性值;// 对象的解构赋值:利用变量名和对象的属性名同名时就可以取得对象该属性的值,和顺序无关。let obj = {name: '马宾',age: 18,title: '宇宙集团军总司令'};let { name, title, age } = obj;// console.log(name, title, age);// 1. 只想取一个值,比如取 courses;对象解构赋值,你想取哪个就写哪个。let zf = {name: '珠峰',age: 10,courses: ['JS', 'UI', 'Architect']};let { courses } = zf;// console.log(courses);// 2. 进一步解构,解构 t_name 的值;let zf2 = {name: '珠峰',age: 10,characters: {teacher: {t_name: 'mabin',t_age: 18}}};let {characters: {teacher: {t_name}}} = zf2;// console.log(t_name);// 3. 重命名:防止和其他变量命名冲突;let job = 'FE';let obj4 = {name: '马宾',job: 'teacher'};let { job: job2 } = obj4; // 从 obj4 中解构 job 属性,并且重命名为 job2// console.log(job2);// 4. 对象解构的默认值: 当解构出来的值是 undefined,默认值才会生效let obj5 = {name: '珠峰'};let {name: name2, address = '北京昌平'} = obj5;// console.log(name2);// console.log(address);// 解构字符串:字符串的解构依赖位置let [x, y, z] = 'HELLO';// console.log(x, y, z);// 函数的参数解构/*// 原来是在函数中对 obj 解构function reg(obj) {let {name, age} = obj;}reg({name: '珠峰',age: 10});*/function reg({name = 'zhufeng', age = 10}) {// 在函数形参位置解构函数执行时传递进来的实参// console.log(name, age);}reg({name: '珠峰'});function getAry([x, y, z]) {console.log(x, y, z);}getAry(['a', 'b', 'c']);// 对象的简洁语法:ES6let config = '110.179.23.123';let pwd = '@#4ghjkl099';let obj6 = {config: config,pwd: pwd};// 当对象属性名和变量名同名时,在对象中只写一个变量名就可以了let obj7 = {config, // config: configpwd // pwd: pwd};console.log(obj6);console.log(obj7);
