我可以为对象的解构赋值预先声明变量吗?

Can I pre-declare variables for destructuring assignment of objects?

背景

当我尝试用数组解构赋值时,我能够预先声明我的变量:

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 quirk/problem?如果它是为 ES6 设计的,为什么数组的处理方式不同?

备注

我知道用 let 替换 var 意味着我不需要预先声明我的变量并且 let 内联是有效的(而且,我相信,一般首选)。我想知道实现之间的区别而不是 "don't do it like that at all" 答案。

当你解构对象时,

  1. 您需要使用与对象中的键相同的变量名。只有这样你才会得到一对一的对应关系,值才会被正确地解构。

  2. 如果你没有使用声明语句,你需要将整个赋值包含在括号中,否则左侧表达式中的对象文字将被视为一个块,你会得到语法错误.


所以你的固定代码看起来像这样

'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;