当在对象的键值对中指定键时(使用下面的符号),解释器(显然)允许使用字符串:
var x = { 'color': '#fff' };
但是,不允许使用函数(返回字符串)动态指定键:
function s()
{
return 'color';
}
var x = { s(): '#fff' };
我猜字符串,在使用该符号时,必须是静态值。
但是我找不到关于那个的 JavaScript 语言规范......
当在对象的键值对中指定键时(使用下面的符号),解释器(显然)允许使用字符串:
var x = { 'color': '#fff' };
但是,不允许使用函数(返回字符串)动态指定键:
function s()
{
return 'color';
}
var x = { s(): '#fff' };
我猜字符串,在使用该符号时,必须是静态值。
但是我找不到关于那个的 JavaScript 语言规范......
在这种情况下,您应该使用此方法:
var x = {};
x[s()] = "#fff";
x[foo()] = "#000";
根据这篇 MDN 文章(我用粗体突出显示):
使用对象初始化器的对象的语法是:
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是一个标识符(名称、数字或字符串文字),每个 value_i是一个表达式,其值被分配给property_i。
因此,在这种文字符号中,不允许评估表达式,例如通过函数调用来确定属性标识符。
在ECMAScript 语言规范中,它更正式地表述为:
物业名称:
- 标识符名称
- 字符串字面量
- 数字字面量
使用 ECMAScript 2015,更多可能成为可能,如MDN 文章中所述:
从 ECMAScript 2015 开始,对象初始值设定项语法也支持计算属性名称。这允许您将表达式放在括号 [ ] 中,该表达式将被计算为属性名称。
// Computed property names (ES6) var i = 0; var a = { ["foo" + ++i]: i, ["foo" + ++i]: i, ["foo" + ++i]: i };
ECMAScript 2015 语言规范中的正式定义有:
物业名称:
- 文字属性名称
- 计算属性名
计算属性名称:
- [赋值表达式]
因此,使用 ES6,您将像这样重写您的示例:
function s()
{
return 'color';
}
var x = { [s()]: '#fff' };
Javascript 中不存在“关联数组”。您可能指的是对象。这是学习 JS 时很常见的错误。
可以使用 { } 或使用new运算符初始化对象,如下所示:
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 的类型,它将返回“对象”。
var typeOfX = typeof x; // 'object'