0

当在对象的键值对中指定键时(使用下面的符号),解释器(显然)允许使用字符串:

var x = { 'color': '#fff' };

但是,不允许使用函数(返回字符串)动态指定键:

function s()
{
    return 'color';
}

var x = { s(): '#fff' };

我猜字符串,在使用该符号时,必须是静态值。

但是我找不到关于那个的 JavaScript 语言规范......

4

3 回答 3

4

在这种情况下,您应该使用此方法:

var x = {};
x[s()] = "#fff";
x[foo()] = "#000";
于 2015-12-13T15:03:29.457 回答
3

根据这篇 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

使用 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' }; 
于 2015-12-13T15:44:50.320 回答
0

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' 
于 2015-12-13T15:12:24.650 回答