在对象的键值对中指定键时使用字符串

时间:2015-12-13 15:01:18

标签: javascript object syntax language-specifications

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

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

但是不允许使用函数(返回字符串)以dinamically方式指定键:

function s()
{
    return 'color';
}

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

我猜字符串在使用该表示法时必须是静态值。

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

3 个答案:

答案 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

使用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'