我可以预先声明用于解构对象分配的变量吗? [复制]

Posted

技术标签:

【中文标题】我可以预先声明用于解构对象分配的变量吗? [复制]【英文标题】:Can I pre-declare variables for destructuring assignment of objects? [duplicate] 【发布时间】:2016-04-22 12:37:30 【问题描述】:

背景

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

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 内联是有效的(并且我相信,通常是首选)。我想知道实现之间的区别,而不是“根本不这样做”的答案。

【问题讨论】:

你想用这个来完成什么:cat: a, dog: b, mouse: c = obj;?您在obj 中有一个完整的对象。如果要将其复制到另一个对象,请使用Object.assign() @jfriend00 我正在学习破坏分配的工作原理——这些示例纯粹是为了学习目的。但一般目的是将值分配给abc,而不是创建一个新对象。解构应该分解而不是复制。 然后,您可以使用普通声明:let myObj = cat: a, dog: b, mouse: c;。您不需要为此进行解构。如果您想从abc 的值中分配现有对象中的属性,那么您只需手动分配它们obj.cat = a; 但我想将'meow' 分配给a,将'woof' 分配给b,并将'squeak' 分配给c。在您的示例中,a 的值是多少? 【参考方案1】:

当你解构一个对象时,

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

    如果不使用声明语句,则需要将整个赋值括在括号中,否则左侧表达式中的对象字面量将被视为块,并且会出现语法错误。


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

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

【讨论】:

啊,谢谢!这是我不明白的包装括号。感谢您澄清否则它将被视为一个块 - 现在更有意义:) 除了“包装括号”,答案是错误的:( @Refael 你能解释一下为什么答案是错误的吗? @thefourtheye 我不知道我当时在想什么……可能是let a, b, c; let obj = cat: 'meow', dog: 'woof', mouse: 'squeak'; (cat: a, dog: b, mouse: c = obj); 请注意,当一行以“opening something”(包括括号)开头时,自动分号插入会失败。因此,如果您省略分号,则需要在它和前一个语句之间有一个 somewhere,例如:;(cat, dog, mouse = obj)

以上是关于我可以预先声明用于解构对象分配的变量吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

javascript 使用解构分配从对象分配变量

类和动态内存分配

Javascript通过解构重新分配let变量[重复]

React Hooks - 具有解构数组变量的 JSDoc

带有变量的 C 数组声明? [复制]

[JavaScript]解构赋值详解