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

Tha*_*you 9 javascript coffeescript

考虑以下

var a = {foo: "bar"};
Run Code Online (Sandbox Code Playgroud)

相当于

var a = {};
a.foo = "bar";
Run Code Online (Sandbox Code Playgroud)

相当于

var a = {};
a['foo'] = "bar";
Run Code Online (Sandbox Code Playgroud)

相当于

var a = {}
var b = "foo";
a[b] = "bar";
Run Code Online (Sandbox Code Playgroud)

是否有可能做类似的事情

var b = "foo";
var a = { [b]: "bar" };
Run Code Online (Sandbox Code Playgroud)

这样的结果就是

// => {foo: "bar"}
Run Code Online (Sandbox Code Playgroud)

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

Vis*_*ioN 6

没有.

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


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

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

console.log( a.foo );  // "bar"
Run Code Online (Sandbox Code Playgroud)

但是,此解决方案不适用于不支持ES6的旧浏览器.

  • 当然,那里有一个更好的左 - 未提及的函数,它可以在每次运行时调用编译器为代价. (3认同)

Tha*_*you 5

ES6支持计算的属性。

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

a.foo; //=> "bar"
Run Code Online (Sandbox Code Playgroud)

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

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

a.foo; //=> "bar"
Run Code Online (Sandbox Code Playgroud)

如果您需要在ES5世界中依赖此行为,则可以依靠功能强大的babel.js将ES6代码转换为与ES5兼容的代码。