什么是解构赋值
匹配指定的模式,从数组和对象中提取值(解构),并对变量进行赋值(赋值)。
数组模式
按照对应的顺序位置解构赋值。
let arr = [1,2,3,4,5];
let [a,b,c,d] = arr;//a=1,b=2,c=3,d=4
数组嵌套匹配
可以匹配嵌套的数组模式进行解构赋值。
let arr = [1,[2,3],4,5];
let [a,b,c,d] = arr;//a=1,b=[2,3],c=4,d=5 没有匹配元素数组的模式,不解构元素数组,并将元素数组直接赋值
let [e,[f,g],h] = arr;//e=1,f=2,g=3,h=4 匹配了数组内元素数组的模式,就会将元素数组的值进行解构
默认值
解构赋值允许指定默认值。
let arr = [1,2];
let [a,b = 4,c = 3] = arr;//a=1,b=2,c=3
内部使用严格相等运算符(===)判断一个位置是否的等于undefined
。
let arr = [1,undefined,null];
let [a,b = 2,c = 3] = arr;//a=1,b=2,c=null
默认值如果是一个表达式,表达式的求值是惰性求值得,即用到的时候才会求值。
function a(){
console.log("aaa");
return "a"
}
function b(){
console.log("bbb");
return "b"
}
let [x = a(),y = b()] = [1];//因为 x 能取值,所以 a 不会执行
console.log(x,y);
//控制台输出
//bbb
//1,b
默认值可以引用解构赋值的其他变量,但该变量必须已经声明
let [x = 1 , y = x] = []; //x = y = 1
let [x = 1 , y = x] = [2]; //x = y = 2
let [x = 1 , y = x] = [1 , 2]; //x = 1 ; y = 2
let [x = y , y = 1] = []; //ReferenceError
对象模式
按照对应的属性名进行解构赋值。
let { a : a , b : bs} = { a : 1 , b : 2};
//a = 1 , bs = 2
如果变量名与属性名相同可以使用简写形式
let { a , b} = { a : 1 , b : 2};
//a = 1 , b = 2
也就是说对象解构赋值的模式是{模式 : 变量}
,属性名需要与模式同名,才会把值赋给变量。
默认值
//普通写法
let {a : b = 1,x : y = 2 , z} = { a : 3 };//b = 3 ; y = 2 ; z = undefined
这里a
和x
都是模式,b
和y
都是变量;模式x
找不到对应的属性,所以变量y
使用了默认值。而默认的默认值是undefined
。
也就是说,对不匹配的变量再解构会报错
let {a : {b}} = {};//报错
默认值可以使用简写模式,此时模式和变量同名。
//简写模式
let {a = 1,x = 2} = { a : 3 };//a = 3 ; x = 2 ;
由于数组的本质是特殊的对象,因此可以对数组进行对象属性的解构,其中模式用数字匹配。
字符串、布尔值、数值的解构赋值
对字符串进行解构是会将字符串转化为类似数组的解构;
布尔值和数值则会先转为对象