0

我有一个问题一直困扰着我很长一段时间,我似乎找不到任何涵盖该主题的资源。JavaScript 中的属性名称如何是字符串文字或数字文字?

var obj = {
    "bar": "foobar",
    "foo": function() { return bar; }
}

自从我几年前了解这个话题以来,这个话题就一直困扰着我。我不知道在哪里可以获得更深入的信息,或者这甚至叫什么。我不知道这是如何设置的,因为我知道正在使用成员 bar 和 foo 创建一个新对象,然后将其分配给 obj 变量。

您不能创建像 var "bar" = "foobar"; 这样的变量。因为你会得到一个语法错误。它对对象字面量如何有效?对此的任何帮助将不胜感激。

4

4 回答 4

7

在 JavaScript 中,属性名称是字符串值 - 任何字符串值。这就是指定语言的方式。

相关制作:

PropertyName :  
    IdentifierName
    StringLiteral
    NumericLiteral

如果提供了标识符或数字文字,则将其转换为字符串值 (SV)。

见:http ://ecma-international.org/ecma-262/5.1/#sec-11.1.5

因此,例如:

var obj = {
    foo: true, // the name of this property becomes 'foo'
    'bar': true, // the name of this property becomes 'bar'
    123: true // the name of this property becomes '123'
};

您甚至可以使用空字符串作为属性名称:

var obj = {
    '': 'foo'
};

obj[''] // 'foo'
于 2013-03-12T03:22:21.017 回答
2

JavaScript 对象字面量是 hashmap 实现:即键值对。键可以用引号或不带引号表示。

也就是说,如果您想以字符串的形式访问属性,请使用以下语法:

obj[str]

但是如果你想通过它的名字访问一个属性,你可以使用

obj.name

于 2013-03-12T03:21:39.713 回答
2

您使用的对象文字语法只是 JavaScript 语法的一部分。您可以使用数字或字符串文字作为属性名称,也可以使用任何有效的变量名称作为属性名称。请注意,无效的变量名称必须用引号括起来,但仍然可以是属性名称(数字文字除外)。

也就是说,您可以将obj = {'"': value}(即引号)作为有效的对象属性名称。但是,如果您在此处省略撇号,则会出现语法错误。

{nameWithoutQuotes: "value"}为方便起见,据我所知,允许使用例如变量名语法。它没有特殊含义,并被视为字符串文字属性名称。在对象字面量定义中到处都有看起来很奇怪",并且在使用类似的访问器语法时也很有意义。例如:

obj = {"with quotes": "q", withoutQuotes: "x"};
obj["with quotes"];
obj.withoutQuotes;

请注意,使用需要引号的属性名称的访问方法也需要引号,而当不需要引号时,可以在没有它们的情况下进行访问。

至于为什么"obj" = "string"不允许,除了它是无效的语法之外,那是因为"obj"字面量没有在内存中创建可以分配的引用。该obj = {}符号创建一个存储在其中的引用,obj并为其每个属性分配内存,如字面语法所述。你可以就obj = "string";


不能从属性名称的JSON字符串中省略引号也可能一文不值。许多解析器不允许这样做。

于 2013-03-12T03:35:07.370 回答
1

为了看到它是绝对有效的,你只需要记住对象是关联数组,即

 foo.bar === foo['bar']

在这种情况下,关联数组的键是任何字符串。

于 2013-03-12T03:22:53.867 回答