2010-10-22 95 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。