//eg
//从数组中提取值,按照对应位置,对变量赋值
let [a,b,c] = [a,b,c];
//各种结构嵌套只要格式一致,还是可以解构相应的值
let [a,[b],[c]] = [1,[2],[3]];
let [ , , a] = [1,2,3];
let [a, ,c] = [1, ,3];
let [a,...b] = [1,2,3,4,5,6]; //b=[2,3,4,5,6]
let [a,b,...c] = [1]; // a = 1; b = undefined; c=[]
let [a] = []; //undefined
let [a,b] = [1]; //b:undefined
//解构失败的值是undefined
右边的值大于等于左边的值(即右边的值包含左边的值)
//部分结构
let [a,b,c] = [1,2,3,4,5,6];
//右边是不是可遍历的结构会报错
let [a] = null;
let [a] = false;
let [a] = {};
let [a] = NAN;
let [a] = 7;
let [a = true] = []; //a = true
let [a = 1] = [null]; // a = null,默认值会失效,因为null === undefined 不成立
惰性求值
function b(){...}
let [a = a()] = [1];
//默认值如果是表达式,会先计算右侧是否有值,如果有直接用右侧的值,如果右侧的值是undefined,才会执行b()
默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
let [x = 1 ; y = x] = []; //1,1
let [x = 1 ; y = x] = [2]; //2,2 右侧的值会覆盖默认值
let [x = y ; y = 1] = []; //报错
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
let {a,b} = {a:1,b:2};
//如果变量名和右侧的属性名不一样,需要写成如下格式
let {testa : testb} = {testa : 'testa'};
testb // 'testa'
//内部的赋值机制如下
let {a:a,b:b} = {a:1,b:2};
//对象的嵌套解构
var node = {
p : [
'hello',
{y : 'world'}
]
};
let { p : [x,{y}]} = node;
x; //hello
y; //world
//p是模式,不是变量,不会被赋值
let x = 1;
let y = 1;
[x,y] = [y,x];
函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。
//返回数组
function test(){
return [1,2,3];
}
let [a,b,c] = test();
//返回对象
function obj (){
return {
a : 1,
b : 2
}
}
let {a,b} = obj();
let json = {
a : 2,
b : 'bbb',
c : [1,2,3,4]
};
let {a,b,c} = json;