是否可以在JavaScript中使用对象文字定义动态命名的属性?

是否可以在JavaScript中使用对象文字定义动态命名的属性?,javascript,coffeescript,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 a = {}; a.foo = "bar"; var a = {}; a['foo'] = "bar"; var a = {} var b = "foo"; a[b] = "bar"; 相当于 var a =

考虑以下几点

var a = {foo: "bar"};
相当于

var a = {};
a.foo = "bar";
var a = {};
a['foo'] = "bar";
var a = {}
var b = "foo";
a[b] = "bar";
相当于

var a = {};
a.foo = "bar";
var a = {};
a['foo'] = "bar";
var a = {}
var b = "foo";
a[b] = "bar";
相当于

var a = {};
a.foo = "bar";
var a = {};
a['foo'] = "bar";
var a = {}
var b = "foo";
a[b] = "bar";
有可能做像这样的事情吗 结果会是

// => {foo: "bar"}

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

(a = {})[b = 'foo'] = 'bar'
不 使用对象文字表示法是无法做到的。


更新:根据您现在可以执行以下操作:

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

console.log( a.foo );  // "bar"
但是,这个解决方案在旧浏览器中不起作用,而旧浏览器是。

JavaScript

var a, b;
(a = {})[b = 'foo'] = 'bar';
咖啡脚本

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

回答你的问题,这是我所知道的唯一方法。它使用
eval
。但是要小心,
eval
是邪恶的

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

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

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

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

这并不完全是一个普通对象,但如果您的目标是将您的属性名称作为变量输入,它会起作用。

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

它在和中实施为:


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环境中依赖此行为,您可以依靠非常强大的功能将您的ES6代码转换为与ES5兼容的代码。

自CoffeeScript起,此功能:

b = "foo"
a = "#{b}": "bar"
它汇编为:

var a, b, obj;

b = "foo";

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

.

我认为
a[b]=“bar”
是唯一的方法。很抱歉,这不是一个对象文字的可能重复。这基本上与OP提到的内容相同。我只是给了你最简洁的方式来写它。@naomik怎么会这样
a
是一个对象文本,属性“foo”立即设置为“bar”。不幸的是,这在技术上已经是OP所拥有的,只是condensed@CaseyFoster,我很感谢您的帮助,但我需要它是一个对象文字。当然,还有一个更好的未提及的函数,它可以在每次运行时调用编译器。为什么在这种情况下它是邪恶的?我不明白为什么人们认为
eval
是100%邪恶的……因为人们不喜欢
eval
还有另一种方法:
新函数(“return{“+b+”:'bar'}”)()
@Ian,因为
eval
完全适用的情况很少,如果不是没有的话
eval
在这种情况下,它甚至不是一个好的解决方案,它是一种黑客行为。@David这并没有让它成为邪恶。我能理解一个论点,那就是这是“不必要的”。当人们说“邪恶”的时候,我打赌他们在想“危险”,因为当他们看到它的时候,人们会立刻声称这是危险的。我同意这不是一个“解决方案”,但黑客什么时候不是解决方案了?在这种情况下,它不像是以高性能为代价去做一大堆额外的事情。如果
JSON
不可用,这不是解析JSON的方式吗?你没有看到人们循环浏览JSON字符串的所有字符,解析它并以此方式构建对象文本,我怎么会忘记这一点。好主意。我想你想要的是
,而不是
=
,对吗?更准确的版本(考虑到属性名中的双引号和其他特殊字符)是
JSON.parse(“{'+JSON.stringify(dynamicProperty)+':“bar”}”)
,但在这一点上,为什么不只写两行(在ES6之前)?(不要介意我的时间机器)