我可以预先声明用于解构对象分配的变量吗? [复制]
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 我正在学习破坏分配的工作原理——这些示例纯粹是为了学习目的。但一般目的是将值分配给a
、b
、c
,而不是创建一个新对象。解构应该分解而不是复制。
然后,您可以使用普通声明:let myObj = cat: a, dog: b, mouse: c;
。您不需要为此进行解构。如果您想从a
、b
和c
的值中分配现有对象中的属性,那么您只需手动分配它们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)
以上是关于我可以预先声明用于解构对象分配的变量吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章