解构赋值的使用方法
ES6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。
var [a,b,c]=[1,2,3];可以从数组中提取值,按照位置的对应关系对变量赋值。本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。如果解构不成功,变量的值就等于undefined。另一种情况是不完全解构,即等号左边的模式只匹配等号右边数组的一部分。这种情况下,解构依然可以成功。
解构赋值不仅适用于var命令,也适用于let和const命令。
解构赋值允许指定默认值。ES6内部使用严格相等运算符(===)判断一个位置是否有值。所以,如果一个数组成员不严格等于undefined,默认值是不会生效的。如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined。
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。如果变量名与属性名不一致,必须写成下面这样:let {first:f,last:l}={first:'1',last:'2'},f//1,l//2。这实际上说明,对象的解构赋值是以下形式的简写。let {first:first,last:last}={first:'1',last:'2'}.也就是说,对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
解构赋值的变量都会重新声明,假如使用var命令不会报错。对象的解构也可以指定默认值。默认值生效的条件是,对象的属性值严格等于undefined。
如果解构失败,变量的值等于undefined。
如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,那么将会报错。这是因为父属性是undefined,再取子属性就会报错。
字符串也可以解构赋值。这是因为,此时字符串被转换成了一个类似数组的对象。类似数组的对象都有length属性,因此还可以对这个属性的解构赋值。
解构赋值的规则是,只要等号右边的值不是对象,就先将其转换为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值都会报错。
函数的参数也可以解构赋值。函数参数的解构也可以使用默认值。
function move({x=0,y=0}){ console.log(x+y) } move({x:3,y:2})//5 move({x:3})//3
只要有可能,就不要在模式中放置圆括号。
变量声明语句中,模式不能带有圆括号。函数参数中,模式也不能带有圆括号。不能将整个模式或嵌套模式中的一层放在圆括号中。
可以使用圆括号的情况只有一种:赋值语句的非模式部分可以使用圆括号。
变量的解构赋值用途很多。
[x,y]=[y,x];代码交换了变量x和y的值,这个写法比用中间值来切换好多了。
函数只能返回一个值,如果返回多个值,只能将其放在数组或对象中返回。有了解构赋值,取出这些值就很方便。return [1,2,3];var [a,b,c]=func();
函数参数的定义。解构赋值可以方便地将一组参数与变量名对应起来。参数是有序的情况下用数组,无序的情况下用对象。
解构赋值对提取JSON对象中的数据尤其有用。
函数参数的默认值。这就避免了在函数体内部再写var foo=config.foo||'default foo';
遍历map结构。for(let [key] of map){}
输入模块的指定方法。没用过。