十三、ES6语法
一、ES6变量
1、let
变量名称不能重复
1 // var语法中下面写法正确,如果使用let定义变量会报错 2 var int = 100; 3 var int = 200;
不能预解释/预解析
-
-
不会预解释let、const声明的变量
-
提前调用var声明的变量,执行结果是undefined
-
变量的作用域
-
-
那么只能在 { } 中调用这个变量,不能在 { } 外调用这个变量
-
2、const
-
-
不能预解释/预解析
-
变量的作用域(同let)
-
const 声明的变量,不允许修改存储的数值
-
声明的一般称为常量 ,也就是存储数据数值不能修改的变量
-
const 一般用于存储引用数据类型,存储的是引用数据类型的内存地址
-
-
-
-
箭头定义在 () 和 {} 之间
-
1 // 普通的匿名函数 2 var fun = function(){}; 3 4 // 箭头函数声明的匿名函数 5 var fun = () => {} 6 7 // 如果只有一个形参要定义,可以不写() 8 var fun = function(e){} 9 var fun = (e) => {} 10 var fun = e => {} 11 12 // {}中如果只有一行执行程序,可以不写{} 13 var fun = function(){console.log();} 14 var fun = () => { console.log(); } 15 var fun = () => console.log(); 16 17 // 只有一个参数,并且只有一行代码,()、{}都可以不写 18 var fun = function(e){console.log(e);} 19 var fun = e => { console.log(e); } 20 var fun = e => console.log(e);
1、函数中的this指向
-
-
this的作用:替换替代this指向的对象
-
1 // 1、function声明的函数this指向是window 2 function fun1() { 3 console.log(this); 4 } 5 fun1(); 6 window.fun1(); 7 8 // 2、匿名函数的this指向是window 9 var fun2 = function () { 10 console.log(this); 11 } 12 fun2(); 13 window.fun2();
this指向绑定事件的标签对象
1 oDiv.onclick = function(){ 2 console.log(this); 3 }
this指向window
1 // this指向是window 2 arr.forEach(function(){console.log(this)}); 3 4 // this指向是window 5 setInterval( function(){ 6 console.log(this); 7 }, 1000); 8 9 // this指向是window 10 setTimeout( function(){ 11 console.log(this); 12 }, 1000);
window:是BOM操作的顶级对象
-
如果父级程序是一个函数,函数也是有this的,那么箭头函数的this,就是父级函数的this
-
1 // function声明的对象中的函数,this指向对象本身 2 const obj = { 3 name:'张三', 4 age:18, 5 fun:function(){ 6 console.log(this); 7 } 8 }
- 对象中的函数使用箭头函数声明,this指向window
1 const obj = { 2 name:'张三', 3 age:18, 4 fun: () => { 5 console.log(this); 6 } 7 }
2、对象和数组的this指向
对象
1 const obj2 = { 2 fun2:()=>{console.log(this)} 3 }
-
-
父级程序是obj,obj是对象,没有this指向
-
数组
1 const arr = [()=>{console.log(this)}];
3、改变this指向
改变函数的this指向,箭头函数是不能改变this指向的
1 const obj1 = { 2 name: '张三', 3 fun: function (a, b, c, d, e) { 4 console.log(a, b, c, d, e); 5 console.log(this); 6 } 7 } 8 9 const obj2 = { 10 name: '李四', 11 }
call()
-
-
调用函数的()中,应该赋值实参
-
第一个实参是,改变的this指向对象
-
1 obj1.fun.call(obj2,100,200,300,400,500);
apply()
-
-
调用函数的()中,应该赋值实参
-
第一个实参是,改变的this指向对象
-
1 obj1.fun.apply(obj2, [100,200,300,400,500] );
bind()
1 // 如果在执行bind时,没有输入实参,在调用时就必须要输入实参 2 const f = obj1.fun.bind(obj2); 3 f(1,2,3,4,5); 4 5 // 如果在执行bind时输入了实参,那么就会执行输入的实参 6 // 调用时再输入数据无效 7 const f = obj1.fun.bind(obj2, 1, 2, 3, 4, 5); 8 f(100, 200, 300, 400, 500);
三、立即执行函数
1 // 第二个()的作用就是作为一个整体,立即执行封装的函数 2 (function fun2() { console.log(456) })()
四、展开合并运算符
-
-
只是不同情况下,执行不同功能
-
语法
1 // arg 形参中以数组的形式存储实参 a,b,c 2 var fun2 = ( ...arg )=>{ 3 console.log(arg) ; 4 } 5 fun2('a','b','c');
1 // 第一个形参,str1,应该存储实参1 a 2 // 第二个形参,str2,应该存储实参2 b 3 // 其他所有的实参,都以数组的形式,存储在arg中 4 var fun3 = ( str1 , str2 ,...arg )=>{ 5 console.log(str1, str2, arg) ; 6 } 7 fun3('a','b','c','d','e','f',1,2,3,4,5,);
五、解构语法
1、数组的解构
将数组的数据单元,解构出来,一一赋值给对应的变量存储
1 const arr1 = ['北京','上海','广州','重庆','天津']; 2 let [str1,str2,str3,str4,str5] = arr1; 3 console.log(str1,str2,str3,str4,str5); 4 5 const arr2 = ['北京','上海',['朝阳区','丰台区','大兴区']]; 6 7 // s3存储的是数组['朝阳区','丰台区','大兴区'],可以继续解构 8 let [s1,s2,s3] = arr2; 9 10 // 每一个变量,存储的是每一个数据单元 11 let [s1,s2,[s3,s4,s5]] = arr2;
2、对象的解构
把对象中,属性(键名/键)存储的属性值(键值/值)解构出来,赋值给变量存储
语法
- 变量名称与键名必须相同
1 const obj = { name:'张三',age:18,sex:'男' }; 2 3 // 通过键名获取数组中的数据,存储在名称相同的变量名称中 4 let { name , age , sex } = obj; 5 6 console.log( name, age, sex ); // 张三 18 男
- 添加别名
1 // 也就是以别名作为变量名称,存储在对象中,对应键名的数据 2 let {name: n, age: a, sex: s} = obj; 3 4 console.log(n, a, s); // 张三 18 男
- 对象中存储对象或者数组
1 const obj2 = {name: '张三', o: {age:18,sex:'男'}}; 2 let { name:n2 , o : o2 } = obj2; 3 let { name:n2 , o : { age: a2, sex: s2} } = obj3;