考虑以下
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中
没有。
有没有办法使用对象的文字符号来做到这一点。
UPDATE:根据ECMAScript标准6.0 ,你现在能做到以下几点:
var b = 'foo';
var a = { [b]: 'bar' };
console.log( a.foo ); // "bar"
然而,这种解决方案将不会在旧的浏览器,它的工作不支持ES6 。
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兼容的代码。
JSON解析让你一个JSON字符串转换成一个对象:
JSON.parse('{"'+dynamicProperty+'":"bar"}');
这不正是一个对象litteral,但如果你的目标是进入你的财产的名称作为一个变量它的作品。
正如其他人说,不,还有目前在中CoffeeScript的对象文本插入钥匙串没有语法; 但似乎在某些时候这个功能存在! 在这些GitHub的问题,有一些关于它的讨论: #786和#1731 。
它在实现可可和为LiveScript为:
b = 'foo'
a = {"#{b}": 'baz'}
# Or..
a = {(b): 'bar'}
由于CoffeeScript的版本1.9.1这工作:
b = "foo"
a = "#{b}": "bar"
它编译为:
var a, b, obj;
b = "foo";
a = (
obj = {},
obj["" + b] = "bar",
obj
);
试试吧 。
JavaScript的
var a, b;
(a = {})[b = 'foo'] = 'bar';
CoffeeScript的
(a = {})[b = 'foo'] = 'bar'
要回答你的问题,这是我知道的唯一途径。 它使用eval
。 但要注意, eval
是邪恶的!
var b = "foo";
var a = eval('({ ' + b + ': ' + '"bar"' + ' })');
这是一个丑陋的解决方案。 发挥它的安全,你不应该依赖于这一点。 不要使用它!
文章来源: Is it possible to define a dynamically named property using object literal in JavaScript?