是否有可能定义使用对象在JavaScript字面动态命名的属性?(Is it possible to

2019-07-17 11:39发布

考虑以下

var a = {foo: "bar"};

相当于

var a = {};
a.foo = "bar";

相当于

var a = {};
a['foo'] = "bar";

相当于

var a = {}
var b = "foo";
a[b] = "bar";

是否有可能做这样的事情

var b = "foo";
var a = { [b]: "bar" };

这样的结果将是

// => {foo: "bar"}

可接受的解决方案是在JavaScript或CoffeeScript中

Answer 1:

没有。

有没有办法使用对象的文字符号来做到这一点。


UPDATE:根据ECMAScript标准6.0 ,你现在能做到以下几点:

var b = 'foo';
var a = { [b]: 'bar' };

console.log( a.foo );  // "bar"

然而,这种解决方案将不会在旧的浏览器,它的工作不支持ES6



Answer 2:

ES6支持计算的属性。

// code from my original question now works in ES6 !
let b = "foo";
let a = { [b]: "bar" };

a.foo; //=> "bar"

任何表达式可以内的可使用[]来定义属性名称

let a = {
  [(xs => xs.join(''))(['f','o','o'])]: 'bar'
};

a.foo; //=> "bar"

如果您需要依赖于这种行为在ES5的世界里,你可以依靠的能力很强babel.js到transpile您ES6代码ES5兼容的代码。



Answer 3:

JSON解析让你一个JSON字符串转换成一个对象:

JSON.parse('{"'+dynamicProperty+'":"bar"}');

这不正是一个对象litteral,但如果你的目标是进入你的财产的名称作为一个变量它的作品。



Answer 4:

正如其他人说,不,还有目前在中CoffeeScript的对象文本插入钥匙串没有语法; 但似乎在某些时候这个功能存在! 在这些GitHub的问题,有一些关于它的讨论: #786和#1731 。

它在实现可可和为LiveScript为:

b = 'foo'
a = {"#{b}": 'baz'}

# Or..
a = {(b): 'bar'}


Answer 5:

由于CoffeeScript的版本1.9.1这工作:

b = "foo"
a = "#{b}": "bar"

它编译为:

var a, b, obj;

b = "foo";

a = (
  obj = {},
  obj["" + b] = "bar",
  obj
);

试试吧 。



Answer 6:

JavaScript的

var a, b;
(a = {})[b = 'foo'] = 'bar';

CoffeeScript的

(a = {})[b = 'foo'] = 'bar'


Answer 7:

要回答你的问题,这是我知道的唯一途径。 它使用eval 。 但要注意, eval是邪恶的!

var b = "foo";
var a = eval('({ ' + b + ': ' + '"bar"' + ' })');

这是一个丑陋的解决方案。 发挥它的安全,你不应该依赖于这一点。 不要使用它!



文章来源: Is it possible to define a dynamically named property using object literal in JavaScript?