【问题标题】:Using strings when specifying a key in an object's key-value pair在对象的键值对中指定键时使用字符串
【发布时间】:2015-12-13 15:01:18
【问题描述】:

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

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

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

function s()
{
    return 'color';
}

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

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

但是我找不到与此相关的 JavaScript 语言规范...

【问题讨论】:

  • js没有关联数组
  • 键期望静态值不能是动态的。这可能是一个原因

标签: javascript object syntax language-specifications


【解决方案1】:

在这种情况下你应该使用这个方法:

var x = {};
x[s()] = "#fff";
x[foo()] = "#000";

【讨论】:

  • 感谢您的回答。我想我可以做到这一点。我不明白的是我使用的表格语法不正确的原因(我正在寻找js官方规范。关于那个)
【解决方案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 是新对象的名称,每个属性_i 是一个标识符(名称、数字或字符串字面量),每个值_ i 是一个表达式,其值被分配给属性_i

因此,在这种文字符号中,不允许评估表达式,例如通过函数调用来确定属性标识符。

ECMAScript Language Specification 中更正式:

属性名:

  • 标识符名称
  • 字符串字面量
  • 数字文字

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 中的正式定义有:

属性名:

  • LiteralPropertyName
  • ComputedPropertyName

ComputedPropertyName:

  • [赋值表达式]

因此,使用 ES6,您可以像这样重写您的示例:

function s()
{
    return 'color';
}

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

【讨论】:

    【解决方案3】:

    “关联数组”在 Javascript 中不存在。您可能指的是对象。这是学习 JS 时很常见的错误。

    Object 可以使用 { } 或使用 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的type,它将返回'object'。

    var typeOfX = typeof x;  // 'object' 
    

    【讨论】:

      猜你喜欢
      • 2018-08-06
      • 2015-09-14
      • 1970-01-01
      • 2015-09-08
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      相关资源
      最近更新 更多