最近看阮一峰的ES6发现了个地方有点不懂,理解之后,特意记录下来。
let obj = {};
let arr = [];
({ foo: obj.prop, bar: arr[0] } = { foo: 123, bar: true });
obj // {prop:123}
arr // [true]
就是上面这块。
首先是外面这个括号,我们知道如果提前定义了一个变量,下面再来解构赋值就得加上括号而不是下面这样
let a;
let b;
let [a, b] = [1, 2];
// Uncaught SyntaxError: Identifier 'a' has already been declared 报错了
然后是里面的东西,我们读前面的内容之后
const node = {
loc: {
start: {
line: 1,
column: 5
}
}
};
let { loc, loc: { start }, loc: { start: { line }} } = node;
line // 1
loc // Object {start: Object}
start // Object {line: 1, column: 5}
我们发现,给对象解构赋值的时候, ’ : ’ 冒号表示这个对象是个模式,而不是变量,只有 ’ = '等号或者不加等号才表示变量赋值,比如
let a;
let b;
({a, b} = {a: 10, b: 12})
// ({a = 0, b} = {a: undefined, b: 12})
所以
({ foo: obj.prop, bar: arr[0] } = { foo: 123, bar: true });
这里面跟前面的例子一样,赋值是赋给 obj 的 prop 以及 arr 的第 0 项!
依照一一对应,所以 obj.prop 赋值 123, 而 arr[0] 赋值 true 就是这么来的。
阮一峰的es6地址:https://es6.ruanyifeng.com/#docs/destructuring
end