是否可以在JavaScript中使用object literal定义动态命名的属性?

时间:2012-12-21 22:00:59

标签: javascript coffeescript

考虑以下

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

7 个答案:

答案 0 :(得分:6)

没有

使用对象文字表示法无法做到这一点。


更新:根据ECMAScript standard 6.0,您现在可以执行以下操作:

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

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

但是,此解决方案不适用于do not support ES6

的旧浏览器

答案 1 :(得分:5)

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将您的ES6代码转换为与ES5兼容的代码。

答案 2 :(得分:4)

JSON parse允许您将JSON字符串转换为对象:

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

这不完全是一个对象,但如果您的目标是将属性名称作为变量输入,则可以使用。

答案 3 :(得分:4)

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

它在CocoLiveScript中实现为:

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

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

答案 4 :(得分:1)

从CoffeeScript version 1.9.1开始,这有效:

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

汇编为:

var a, b, obj;

b = "foo";

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

Try it

答案 5 :(得分:0)

的JavaScript

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

的CoffeeScript

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

答案 6 :(得分:-1)

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

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

这是一个丑陋的解决方案。为了安全起见,你不应该依赖于此。 不要使用它!