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

Using strings when specifying a key in an object's key-value pair

本文关键字:字符串 键值对 对象      更新时间:2023-09-26

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

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

因此,在这种文字表示法中,不允许对表达式进行求值,例如通过函数调用来确定属性标识符。

在ECMAScript语言规范中,它被更正式地称为:

属性名称:

  • 标识符名称
  • 字符串文字
  • NumericLiteral

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

属性名称:

  • LiteralPropertyName
  • ComputedPropertyName

ComputedPropertyName:

  • [AssignmentExpression]

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

function s()
{
    return 'color';
}
var x = { [s()]: '#fff' }; 
"关联数组"在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'