基本用法
ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)
//ES5:为变量赋值,只能直接指定值
var a = 1;
var b = 2;
var c = 3;
//ES6:“模式匹配”。可以从数组中提取值,按照位置的对应关系对变量赋值
var [a,b,c]= [1,2,3];
let [foo,[[bar],baz]]=[1,[[2],3]];
foo // 1
bar // 2
baz // 3
如果解构不成功,变量的值就等于undefined
var [foo]=[];
不完全解构,等号左边的模式只匹配等号右边数组的一部分。这种情况下解构OK
let [x,y]=[1,2,3];
x //1
y //2
如果等号的右边不是数组(或者严格说,不是可遍历的解构),那么将会报错。
//报错
let [foo]=1;
let [foo]=false;
let [foo]=NaN;
let [foo]=undefined;
let [foo]={};
上面的表达时都会报错,因为等号右边的值,要么转为对象以后不具备Iterator接口,要么本身就不具备Iterator接口
解构赋值不仅适用于var命令,也适合用于let和const命令。
对于set结构,也可以使用数组的解构赋值。
let [x,y,z]=new Set(["a","b","c"]);
x //"a"
事实上,只要某种数据结构具备Iterator接口,都可以采用数组形式的解构赋值。
默认值
解构赋值允许制定默认值。
ES6内部使用严格相等运算符===判断一个位置是否有值。所以,如果一个数组成员不严格等于undefined,默认值是不会生效的。
如果默认值是一个表达式,那么这个表达式是惰性求值的。即只有在用到的时候才会求值。
默认值可以引用解构赋值的其他变量,但该变量必须已经声明。