Javascript ES6解构中的计算属性-解构整个对象

Javascript ES6解构中的计算属性-解构整个对象,javascript,ecmascript-6,Javascript,Ecmascript 6,我有一个变量: var a = {b:1, c:2, d:'rawr', rawr:10}; 我想将其分解为本地范围,因此我要: var {b, c, d} = a; 这很好,但我需要把rawr拿出来。我试过这个: var {b, c, d, [a.d]} = a; 但这给了我缺失:在属性id之后,所以我尝试了: 所以我想做两步: var {b, c, d} = a; var {[d]} = a; 但是,这给了我SyntaxError:missing:after属性id。ES6中是否有这

我有一个变量:

var a = {b:1, c:2, d:'rawr', rawr:10};
我想将其分解为本地范围,因此我要:

var {b, c, d} = a;
这很好,但我需要把
rawr
拿出来。我试过这个:

var {b, c, d, [a.d]} = a;
但这给了我
缺失:在属性id之后
,所以我尝试了:

所以我想做两步:

var {b, c, d} = a;
var {[d]} = a;
但是,这给了我
SyntaxError:missing:after属性id
。ES6中是否有这样做的方法

预期结果是:

var b = 1;
var c = 2;
var d = 'rawr';
var rawr = 10;

您可以按如下方式对其进行分解:

var {b, c, d, [d]: q} = a;
因此,属性中名为
d
的内容将分配给
q

UPD


您在更新中要求的是不可能的。*

您可以使用
Object.keys()
Function.prototype.bind()
,但需要注意的是变量的值在数组中;尚未确定如何仅返回变量

var a={
b:1,
c:2,
d:‘rawr’,
罗尔:10
};
功能de(val,键){
var[val]=窗口[val]=[a[val]];
}
Object.keys(a.forEach(de.bind(this));

控制台日志(b、c、d、rawr)您需要给它分配一个变量。不能使用“computed”变量name1,因为这将违反标识符的静态范围解析规则。所以你应该这么做

var {b, c, d, [a.d]: rawr} = a;
获取
rawr
变量中
a.d
命名属性的值


1:好吧,你可以在草率模式下使用
eval
with
语句来做这件事,但正因为如此,这两者都被鄙视。

我不确定,但我怀疑您是否能够在本地范围内从属性名称动态创建变量。不确定预期结果是什么?假设这是可能的,您将如何访问该变量(
rawr
)??你最终需要做什么?@guest271314:我确信原始对象可以使用。ECMAScript6添加这种分解糖是有原因的。人们有时希望对某些对象属性具有局部变量访问权限。有时这是为了提高性能,因为从变量中读取值通常比从变量中读取对象然后查找其属性快。或者,他们希望在不改变对象的情况下局部地改变一个值。为此目的,解构很方便,但并非严格必要。
a.rawr
的值将位于局部变量
q
中。在所示的两次尝试中,他使用变量声明语法,同时尝试使用
a.d
的值。很明显,他正在尝试创建变量
rawr
。非常感谢,我在问题中添加了预期结果。我试图将
var rawr=10
放入本地范围。这种方法非常棒,因为它可以得到
q.rawr=10
,也许可以用
This
重新播放
q
,嗯?@Noitidart:在局部范围内创建动态变量的唯一方法是通过
eval
。但这在严格模式下是行不通的…
var[val]=[a[val]]
var-val=a[val]
@FelixKling是的,如果在
=
的另一侧用iterable括起来,可以使用
[]
符号来分解对象<代码>b
c
d
是在
之外定义的。forEach()
数组解构。。。对我被动态属性弄糊涂了,看来你也是;)因为
var[val]
将创建一个名为
val
的变量。。。这就是你想要的吗?@FelixKling很好奇为什么
rawr
未定义的
c
d
forEach()之外的
console.log(b,c,d)
“为什么变量可以在
forEach
之外访问?”?您正在使它们成为本地的
forEach
(因为
var
)。这些变量一定是来自你以前的一个实验。@zerkms我在这方面也投票给你了。然而这是我的错这是一个愚蠢的问题,我只是在探索es6,请原谅。在你试图帮助我的过程中,你被某人投票否决了:(感谢@Bergi在
eval
with
中关于为什么他们不被看好的注释。这是一个非常有用的注释!可能值得指出的是
eval
with
都不能在严格模式下工作(
eval
“工作”)但不允许在同一范围内声明变量)。我假设如果代码是用ES6编写的,则更可能是在严格模式下编写的。@FelixKling:我正要添加它:-)