本文参考阮一峰老师es6入门做的学习笔记。
1.数组的解构赋值。
ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称之为解构。
以前,为变量赋值,只能直接指定值。
let a = 1;
let b = 2;
let c = 3;
ES6允许写成这样。
let [a,b,c] = [1,2,3];
demo小例子:如果等号左边的变量按顺序匹配等号右边的值没有就属于结构不成功,值为undefind。解构是按顺序匹配。即可以不完全解构,等号左边的会依匹配等号右边的,没有的就是undefind。(数组里面套数组,会以每个数组的起始位置开始匹配。)注意:左边的格式与右边的格式必须保持一样。
let [aa,[bb],cc] = [1,2,3];//这样是解构不了。
let [,,aaa] = [2]; //aaa是undefind
如果等号右边不是数组(或则严格的说,不可遍历的结构)那么将会报错。
let [foo] = 1;let [foo] = false;let [foo] = NaN;let [foo] = undefined;let [foo] = null;let [foo] = {};
对于Set结构,也可以使用数组的解构赋值。
let [xx,yy,zz] = new Set(['11','22','33']); console.log(xx)//11; console.log(yy)//22; console.log(zz)//33;
解构赋值允许指定默认值。(注意:ES6内部使用严格相等运算符‘===’,判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会有效)。
如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用的时候,才会求值。
2.对象的解构赋值。
let {foo,bar} = {foo:'aaa',bar:'bbb'};
foo//aaa;
bar//bbb
对象的解构与数组的解构有一个重要的不同。数组的元素是按次序排列的,变量的值由它的位置决定;而对象的属性没有次序,变量名必须与属性名同名,才能取到正确的值。
如果变量名与属性名不一致,必须写成下面这样:
从图2可以看出对象的解构赋的内部机制,是先找到同名的属性,然后赋值给对应的变量。真正被赋值的是后者。上面的代码中,foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foo。
与数组一样,解构也可以用于嵌套结构的对象:注意,这时p是模式,不是变量,因此不会被赋值。
如果p也要作为变量赋值,可以写成下面这样:
上面的代码有三次解构赋值,分别是loc、start、line三个属性的解构赋值。注意:最后一次对line属性的解构赋值之中,只有line是变量,loc和start都是模式,不是变量。
嵌套赋值例子:
对象的解构也可以指定默认值。默认值生效条件是,对象的属性严格等于 undefind。与数组属性解构默认值一样。
由于数组本质是特殊的对象,因此也可以对数组进行对象属性解构。arr的索引对应对象的键。
3.字符串的解构赋值。
字符串也可以解构赋值,这是因为此时字符串被转换成了一个类似数组的对象。
const [a,b,c,d,e] = 'hello';
console.log(a)//h。。。
类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。
let {length:len} = 'hello';
console.log(len)//5
4.数值和布尔值的解构赋值。
解构赋值时,如果等号右边边是数值和布尔值,则会先转为对象。
let {toString:s} =123;
s === Number.prototype.tostring;//true
let {toString:s} = true;
s===Boolean.prototype.tostring;//true
5.函数参数的解构赋值。
function add([x,y]){
return x+y;
}
add([1,2])//3
上面代码中,函数add的参数表面上是一个数组,但在传入参数的那一刻,数组参数就被解构成变量x和y。
6.用途
(1)交换变量的值。
let x=1;let y = 2; [x,y] = [y,x];//x=2,y=1
(2)从函数返回多个值
函数只能返回一个值,如果有多个值,只能将它放在数组或对象里返回。有了解构赋值,取这些值就非常方便。
(3)函数参数的定义方便地将一组参数与变量名对应起来。解构赋值可以方便的将一组参数与变量名对应起来。
//参数是一组有序的值。
function f([x,y,z]){....}
f([1,2,3]);
//参数是一组无秩序的值。
function f({x,y,z}){...}
f({z:3,y:2,x:1});
(4)提取JSON数据。下面代码可以快速提取JSON数据的值。
(5)函数参数的默认值。指定参数的默认值,就避免了在函数体内部写var foo = config.foo || 'defaultfoo';这样的语句。
(6)遍历Map结构。
任何部署了Iterator接口的对象,都可以用for...of循环遍历。Map结构原生支持Iterator接口,配合变量的解构赋值,获取键名和键值就非常方便。