ES6允许按照一定模式, 从数组和对象中提取值, 对变量进行赋值,成为解构赋值
// 数组解构
let [a, b, c] = [1, 2, 3];
let [, , third] = ['a', 'b', 'c'];
let [foo, [[bar], baz]] = [1, [[2], 3]];
// 配合默认值
let [foo = true] = [];
foo // true
在解构赋值时,若值严格(===)等于undefined,则使用默认值。 注意: 换言之,如果取值结果为null, 则不会使用默认值
let { x = 3 } = { x: null }
x // null
let { y = 3 } = { y: undefined }
y // 3
let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
foo // 'aaa'
bar // 'bbb'
若需要解构值赋给不同的变量名
let { foo: foo1, bar: bar1 } = = { foo: 'aaa', bar: 'bbb' };
foo1 // 'aaa'
bar1 // 'bbb'
如果变量声明和解构赋值在先后两句语句中,则解构赋值整句必须带上括号
let foo1;
({ foo: foo1 } = { foo: 1});
foo1 // 1
支持嵌套解构的对象解构
var node = { loc: { start: { line: 1, column: 5 } } }
let { loc: { start: { line } } } = node;
// 此处只有产生了一个变量line
line // 1
对字符串和数字能够进行解构也是因为JS会在字符串和数字进行点号运算时将其包装成对象
let {toString: s} = 123;
s === Number.prototype.toString // true
const [a, b, c, d, e] = 'hello';
let {toString: s} = true;
s === Boolean.prototype.toString // true
函数参数的解构赋值及默认值与上面的解构相同
function add([x, y]){
return x + y;
}
add([1, 2]);