2010-10-22 93 views
10

我用萤火来测试这两种情况下,他们似乎由结果非常相似:{active:“yes”}和{“active”:“yes”}有什么区别?

>>> var x = {"active": "yes"} 
>>> x.active 
"yes" 
>>> var x = {active: "yes"} 
>>> x.active 
"yes" 

但我敢肯定有这两条,甚至性能相关的差异之间存在差异。底线 - 我想知道{active:“yes”}和{“active”:“yes”}是否有区别。

回答

28

两者都有效。然而,有些关键字不能像delete那样使用,所以为了避免将它们用引号括起来,所以它们不会被ECMAScript解析器逐字地处理,而是明确指定为字符串。

此外,JSON spec要求键有他们周围的报价:

的字符串开始和
引号

结束,因此{key:'value'}不是有效的JSON,但有效的JS,而{"key":"value"}是有效的JS和JSON。

关键字和无效/含糊的键的

例子:

>>> ({delete:1}) 
SyntaxError: Unexpected token delete 
>>> ({'delete':1}) 
Object 

又如:

>>> ({first-name:'john'}) 
SyntaxError: Unexpected token - 
>>> ({'first-name':'john'}) 
Object 
>>> ({'first-name':'john'})['first-name'] 
"john" 
+3

许多JSON解析不会处理未引用的属性。在Chrome中,例如:'JSON.parse('{“a”:3}')'可以,'JSON.parse('{a:3}')'引发异常。 – 2010-10-22 16:21:11

+2

实际上'{“key”:'value'}'由于key和_string_值的双引号的要求而不是有效的JSON。 – mogsie 2010-10-22 20:13:05

+0

@Marcel J .:许多JSON解析器不会处理这个问题,因为{{:3}'不是有效的JSON。 – Thanatos 2010-10-22 20:29:07

11

两者都是有效的JavaScript(虽然有些名字只能用引号,active不在其中)。

后者是无效的JSON(在JSON中引用的名称是强制性的)。

+4

+1,重要的区别是一个是JSON,另一个不是。 – molf 2010-10-22 16:21:43

+3

@molf:技术上都不是JSON;) – 2010-10-22 16:24:49

+0

@Roatin:对不起?什么不是JSON关于'{“active”:“是”}? – 2010-10-22 16:44:39

2

在JavaScript中,{"active": "yes"}{'active': "yes"}{"active": 'yes'}{active: 'yes'}都是一样的 - 如果你使用的是保留的关键字(如MEDER指出的),你必须报价的关键 - 否则,关键并不需要被引用。

在JSON,而另一方面所有键必须"引用。
{"active": "yes"}是有效的JSON。
{'active': "yes"},{"active": 'yes'}{active: 'yes'}没有。

+2

JSON只识别用于引用字符串的'“,所以只有第一个例子是有效的JSON。 – Quentin 2010-10-22 16:25:38

+0

@David - 修正了,感谢这个catch! – 2010-10-22 16:33:05

+1

'{”active“:'yes'}'仍然无效。引用规则适用于所有字符串,而不仅仅是关键字名称.JSON明显缺乏TMTOWTDI :) – Quentin 2010-10-22 16:37:25

0

如果您将此用于JSON,则名称(active)必须用引号引起来。它仍然可以在没有它的情况下在JavaScript中工作,但它在技术上是格式不正确的JSON。
请参阅:http://json.org/
请注意,object需要string作为名称(冒号前的位)。

3

每一个有效的JSON也是有效的JavaScript,但并不是每一个有效的JavaScript也是有效的JSON作为JSON是JavaScript的一个子集:

JSON⊂的JavaScript

JSON需要名字的名字/值对在JavaScript没有的时候被引用(只要它们不是保留关键字)。

所以你的第一个例子{"active": "yes"}是有效的JSON和有效的JavaScript,而第二个例子{active: "yes"}只是有效的JavaScript。