变量的解构赋值:ES6按照一定模式从数组和对象中提取值,对变量进行赋值,这被称为解构赋值。下面是几个例子:
let [foo,[[bar],baz]]=[1,[[2],3]];
foo //1
bar //2
baz //3
let [x,,y]=[1,2,3]
x //1
y // 3
let [head,...tail]=[1,2,3,4];
head // 1
tail //[2,3,4]
let [x,y,...z]=['a']
x //'a'
y //undefined
z // []
本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。如果解构不成功,变量的值就等于undefined。
let [foo] = [];
let [bar, foo] = [1];
以上两种情况都属于解构不成功,foo的值都会等于undefined。
另一种情况是不完全解构,即等号左边的模式,只匹配一部分等号右边的数组。这种情况下,解构依然成功。例如:
let [x,y]=[1,2,3];
x //1
y // 2
let [a,[b],d]=[1,[2,3],4];
a //1
b //2
d //4
解构赋值允许指定默认值,ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,**只有当一个数组成员严格等于undefined,默认值才会生效。**如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值。
let [foo = true] = [];
foo // true
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
let [x = 1] = [undefined];
x // 1
let [x = 1] = [null];
x // null 如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined。
默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
let [x = 1, y = x] = []; // x=1; y=1
let [x = 1, y = x] = [2]; // x=2; y=2
let [x = 1, y = x] = [1, 2]; // x=1; y=2
let [x = y, y = 1] = []; // ReferenceError: y is not defined 因为x用y做默认值时,y还没有声明