2013-03-12 170 views
0

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

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

从几年前我了解到这个话题以来,这个话题一直困扰着我。我不知道要在哪里获得更深入的信息,或者甚至称之为什么。我不知道这是如何设置的,因为我知道一个新对象正在与成员一起创建,并且它被赋值给obj变量。

你不能像var“bar”=“foobar”创建一个变量;因为你会得到一个语法错误。它如何对对象文字有效?任何对此的帮助将非常感激。

+0

'var bar ='foobar';'在你的情况下无法工作? – Raptor 2013-03-12 03:19:13

+2

这就是语法的工作方式。 – SLaks 2013-03-12 03:20:11

+0

'obj ['property']'语法需要它。 – 2013-03-12 03:21:14

回答

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' 
+0

我想你的东西。我试图更好地把握这一点。无论您传入的标识符是否由语言自动引用,属性名称都会自动呈现为字符串值。为什么在编写jSON时总是引用属性?这是因为其他语言如何阅读它? – W3Geek 2013-03-12 03:33:04

+0

@ W3Geek如果您提供了标识符,则其相应的字符串值将用作属性名称。这里没有引号,因为引号只存在于字符串*文字*(源代码)中,而在这里,标识符直接转换为字符串*值*(内存)。 ***由于各种原因,JSON更具限制性。 – 2013-03-12 03:36:10

2

JavaScript对象文字是散列图实现:即键值对。密钥可以用引号或不用引号表示。

这就是说,如果你想访问一个属性为一个字符串,可以使用下面的语法:

obj[str]

但是如果你想用它的名字来访问属性,可以使用

obj.name

1

为了看到这是绝对有效的,你只需要回想一下,对象是关联数组,即

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

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

2

您正在使用的对象字面值语法is just part of JavaScript's syntax。您可以使用数字或字符串文字作为属性名称以及任何有效的变量名称作为属性名称。请注意,无效变量名称必须用引号包装,但仍可以是属性名称(数字文字是一个例外)。

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

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

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

注意使用需要引号的属性名称访问的方法还需要加引号,而在不要求报价访问可以没有他们来完成。

至于为什么"obj" = "string"是不允许的,除非它是无效的语法,这是因为"obj"文字不会在内存中创建可分配给的引用。 obj = {}表示法创建一个存储在obj中的引用,并为其每个属性分配内存,如文字语法所述。你可以做出obj = "string";


这也可能是一文不值的报价不能从JSON字符串属性名称中省略了类似的声明。许多解析器不会允许它。

+0

我认为许多解析器不会允许它,因为JavaScript中的标识符是严格意义上的JavaScript语言......如果你明白我的意思。 – W3Geek 2013-03-12 22:42:15

+0

如果任何JSON解析器允许省略引号,那么解析器不会实现JSON标准。 – 2013-04-19 10:21:40