在对象的键值对中指定键时(使用下面的符号),解释器(显然)允许使用字符串:
var x = { 'color': '#fff' };
但是不允许使用函数(返回字符串)以dinamically方式指定键:
function s()
{
return 'color';
}
var x = { s(): '#fff' };
我猜字符串在使用该表示法时必须是静态值。
但是我找不到关于那个的JavaScript语言规范...
答案 0 :(得分:4)
在这种情况下,您应该使用此方法:
var x = {};
x[s()] = "#fff";
x[foo()] = "#000";
答案 1 :(得分:2)
根据this MDN article(我用粗体突出显示):
使用对象初始值设定项的对象的语法是:
var obj = { property_1: value_1, // property_# may be an identifier... 2: value_2, // or a number... // ..., "property n": value_n }; // or a string
其中obj是新对象的名称,每个property_ i 是一个标识符(名称,数字或字符串文字),每个值_ i 是一个表达式,其值分配给property_ i 。
因此,在这种文字符号中,不允许评估表达式,例如通过函数调用来确定属性标识符。
在ECMAScript Language Specification中更正式地提出:
的PropertyName:
- IdentifierName
- 串文字
- NumericLiteral
使用ECMAScript 2015可以实现更多功能,如this MDN article:
中所述从ECMAScript 2015开始,对象初始化程序语法还支持计算属性名称。这允许你将一个表达式放在方括号[]中,它将被计算为属性名称。
// Computed property names (ES6) var i = 0; var a = { ["foo" + ++i]: i, ["foo" + ++i]: i, ["foo" + ++i]: i };
ECMAScript 2015 Language Specification中的正式定义有:
的PropertyName:
- LiteralPropertyName
- ComputedPropertyName
ComputedPropertyName:
- [ AssignmentExpression ]
因此,使用ES6,您可以像这样重写您的示例:
function s()
{
return 'color';
}
var x = { [s()]: '#fff' };
答案 2 :(得分:0)
Javascript中不存在“关联数组”。你可能指的是对象。在学习JS时,这是一个非常常见的错误。
对象可以使用{}初始化,也可以使用新运算符进行初始化,如下所示:
var x = {};
var y = {foo : 'bar'};
var z = new Object();
访问对象属性时,您可以使用。运算符或括号。
var somevalue = y.foo; // 'bar'
var someother = y['foo'] // 'bar'
在你目前的情况下,你需要这样的东西:
var x = new Object(); // or {}
x[s()] = "#fff";
对象类型
如果您检查x的类型,它将返回'object'。
var typeOfX = typeof x; // 'object'