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:我正要添加它:-)