我用萤火来测试这两种情况下,他们似乎由结果非常相似:{active:“yes”}和{“active”:“yes”}有什么区别?
>>> var x = {"active": "yes"}
>>> x.active
"yes"
>>> var x = {active: "yes"}
>>> x.active
"yes"
但我敢肯定有这两条,甚至性能相关的差异之间存在差异。底线 - 我想知道{active:“yes”}和{“active”:“yes”}是否有区别。
我用萤火来测试这两种情况下,他们似乎由结果非常相似:{active:“yes”}和{“active”:“yes”}有什么区别?
>>> var x = {"active": "yes"}
>>> x.active
"yes"
>>> var x = {active: "yes"}
>>> x.active
"yes"
但我敢肯定有这两条,甚至性能相关的差异之间存在差异。底线 - 我想知道{active:“yes”}和{“active”:“yes”}是否有区别。
两者都有效。然而,有些关键字不能像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"
两者都是有效的JavaScript(虽然有些名字只能用引号,active
不在其中)。
后者是无效的JSON(在JSON中引用的名称是强制性的)。
+1,重要的区别是一个是JSON,另一个不是。 – molf 2010-10-22 16:21:43
@molf:技术上都不是JSON;) – 2010-10-22 16:24:49
@Roatin:对不起?什么不是JSON关于'{“active”:“是”}? – 2010-10-22 16:44:39
在JavaScript中,{"active": "yes"}
,{'active': "yes"}
,{"active": 'yes'}
和{active: 'yes'}
都是一样的 - 如果你使用的是保留的关键字(如MEDER指出的),你必须报价的关键 - 否则,关键并不需要被引用。
在JSON,而另一方面所有键和值必须与"
引用。
{"active": "yes"}
是有效的JSON。
{'active': "yes"}
,{"active": 'yes'}
和{active: 'yes'}
没有。
如果您将此用于JSON,则名称(active
)必须用引号引起来。它仍然可以在没有它的情况下在JavaScript中工作,但它在技术上是格式不正确的JSON。
请参阅:http://json.org/
请注意,object
需要string
作为名称(冒号前的位)。
每一个有效的JSON也是有效的JavaScript,但并不是每一个有效的JavaScript也是有效的JSON作为JSON是JavaScript的一个子集:
JSON⊂的JavaScript
JSON需要名字的名字/值对在JavaScript没有的时候被引用(只要它们不是保留关键字)。
所以你的第一个例子{"active": "yes"}
是有效的JSON和有效的JavaScript,而第二个例子{active: "yes"}
只是有效的JavaScript。
许多JSON解析不会处理未引用的属性。在Chrome中,例如:'JSON.parse('{“a”:3}')'可以,'JSON.parse('{a:3}')'引发异常。 – 2010-10-22 16:21:11
实际上'{“key”:'value'}'由于key和_string_值的双引号的要求而不是有效的JSON。 – mogsie 2010-10-22 20:13:05
@Marcel J .:许多JSON解析器不会处理这个问题,因为{{:3}'不是有效的JSON。 – Thanatos 2010-10-22 20:29:07