结构赋值是一种赋值模式,通过将 属性/值 从 对象/数组 中取出,赋值给其他变量。
注意:
let [a = 1] = [undefined];// a:1
而 let [a = 1] = [null];// a:null
;let [a = 1, b = a] = [1, 2]; // a:1; b:2
正确,而 let [a = b, b = 1] = []; // ReferenceError: b is not defined
报错var a, b, rest, k=1;
[a, b, k] = [10, 20];
console.log(a); // 10
console.log(b); // 20
console.log(k); // undefined,这里右边没有值给到k了,所以undefined
[a, b, k=2] = [10, 20];
console.log(a); // 10
console.log(b); // 20
console.log(k); // 2
[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(a); // 10
console.log(b); // 20
console.log(rest); // [30, 40, 50]
({ a, b } = { a: 10, b: 20 });
console.log(a); // 10
console.log(b); // 20
// Stage 4(已完成)提案中的特性
({a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40});
console.log(a); // 10
console.log(b); // 20
console.log(rest); // {c: 30, d: 40}
// 变量声明并赋值时的解构
var foo = [1, 2];
var [one, two] = foo;
console.log(one); // 1
console.log(two); // 2
// 变量先声明后赋值时的解构
var a, b;
[a, b] = [1, 2];
console.log(a); // 1
console.log(b); // 2
防止从数组中取出一个值为undefined的对象,可以在表达式左边的数组中为任意对象预设默认值。
var a, b;
[a=0, b=2] = [1];
console.log(a); // 1
console.log(b); // 2
在一个解构表达式中可以交换两个变量的值。
注意:没有解构赋值的情况下,交换两个变量需要一个临时变量(或者用低级语言中的XOR-swap 技巧)
var a = 1;
var b = 2;
[a, b] = [b, a];
console.log(a); // 2
console.log(b); // 1
返回值是数组的都符合这种模式,如正则表达式的exec()。
function f() {
return [1, 2];
}
var a, b;
[a, b] = f();
console.log(a); // 1
console.log(b); // 2
以[, ,]的形式忽略对应位置的值。
var foo = [1, 2, 3];
var [a, , b] = foo;
console.log(a); // 1
console.log(b); // 3
当解构一个数组时,可以使用剩余模式,将数组剩余部分赋值给一个变量。
var [a, ...b] = [1, 2, 3];
console.log(a); // 1
console.log(b); // [2, 3]
注意:如果剩余元素右侧有逗号,会抛出 SyntaxError,因为剩余元素必须是数组的最后一个元素。
var [a, ...b,] = [1, 2, 3];
// SyntaxError: rest element may not have a trailing comma
var o = {a: 1, b: true};
var {a, b} = o;
console.log(a); // 1
console.log(b); // true
一个变量可以独立于其声明进行解构赋值。
注意:
var a, b;
({a, b} = {a: 1, b: 2});
console.log(a); // 1
console.log(b); // 2
与数组解构类似的,变量可以先赋予默认值,当要提取的对象对应属性解析为 undefined,变量就被赋予默认值。
var {a = 0, b = 2} = {a: 1};
console.log(a); // 1
console.log(b); // 2
可以从一个对象中提取变量并赋值给和对象属性名不同的新的变量名。
var o = {a: 1, b: true};
var {a: foo, b: bar} = o;
console.log(foo); // 1
console.log(bar); // true
一个属性可以同时从一个对象解构,并分配给一个不同名称的变量或分配一个默认值,以防未解构的值是 undefined。
var {a:aa = 0, b:bb = 2} = {a: 1};
console.log(aa); // 1
console.log(bb); // 2
参考:
1.《Destructuring assignment - JavaScript | MDN》;
2.《变量的解构赋值 - ECMAScript 6入门》;