背景
当我尝试使用数组解构赋值时,我能够预先声明我的变量:
let a, b, c;
let arr = [1, 2, 3, 4, 5];
[a, b, c] = arr;
console.log(a) // logs 1
console.log(b) // logs 2
console.log(c) // logs 3
这很好地通过了Babel编译器。
然而,当我尝试对对象做同样的事情时,我收到了错误
let a, b, c
let obj = {cat: 'meow', dog: 'woof', mouse: 'squeak'};
{cat: a, dog: b, mouse: c} = obj;
console.log(a) // I want this to log 'meow'
console.log(b) // I want this to log 'woof'
console.log(c) // I want this to log 'squeak'
问题
这是ES6还是Babel的怪癖/问题?如果它是ES6的故意,为什么与数组的处理方式有所不同?
注意
我理解将var
替换为let
意味着我不需要预先声明我的变量,并且let
内联有效(并且,我相信,一般都是首选的)。我想知道实施之间的区别,而不是“不要这样做”#34;答案。
答案 0 :(得分:53)
当您破坏对象时,
您需要使用与对象中的键相同的变量名称。只有这样,您才能获得一对一的通信,并且这些值将被正确解构。
如果你没有使用声明语句,你需要将整个赋值包装在括号中,否则左侧表达式中的对象文字将被视为一个块,你将得到SyntaxError。
所以你的固定代码就像这样
'use strict';
let cat, dog, mouse;
let obj = {cat: 'meow', dog: 'woof', mouse: 'squeak'};
({cat, dog, mouse} = obj); // Note the `()` around
您实际上可以写与
相同'use strict';
let obj = {cat: 'meow', dog: 'woof', mouse: 'squeak'};
let {cat, dog, mouse} = obj;