2010-01-15 19 views

回答

11

在JavaScript中,這兩種方式都幾乎等同,你可以同時使用,但與加引號鍵版本不能定義與保留關鍵字的名稱屬性,例如:

// valid 
var obj = { 
    'for': 'test' 
}; 

// SyntaxError 
var obj = { 
    for: 'test' 
}; 

這就是爲什麼JSON standard允許按規範只能使用quoted keys

編輯:好吧,現在讓我們看看爲什麼。

Object initializer的語法是這樣定義的:

 
ObjectLiteral : 
    {} 
    { PropertyNameAndValueList } 

PropertyNameAndValueList : 
    PropertyName : AssignmentExpression 
    PropertyNameAndValueList , PropertyName : AssignmentExpression 

而且屬性名令牌可以是:

 
PropertyName : 
    Identifier 
    StringLiteral 
    NumericLiteral 

如果是標識符,這是很清楚的並通過規範明確指出它不能是Reserved Word,因爲:

 
7.5.1 Reserved Words 
Description 

Reserved words cannot be used as identifiers. 

而且,Identifier語法的第一個定義是:

 
Identifier :: 
    IdentifierName but not ReservedWord 
+0

爲什麼?背後有什麼魔力? – user198729 2010-01-15 07:25:12

+2

+1 CMS,很好的答案。 @unnown你不能使用沒有引號的任何保留字。下面是一個供您參考的列表:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Reserved_Words – 2010-01-15 07:28:11

+0

這是一個用作字典鍵的字符串,另一個是由語言分析的標記因此,然後將其用作字典中的字符串。 – 2010-01-15 07:28:30

1

我平時報價key和值是安全的。如果沒有引用,某些關鍵字和其他約束可能會導致密鑰錯誤。

3

第一種方式非常好,但有時您需要使用第二種方法,前提是您有一個聲明屬性爲保留關鍵字的問題。

引號總是一個字符串,否則解釋器可能會將其解釋爲文字關鍵字/變量。

3

如果使用雙引號而不是單引號,則第二個將與JSON兼容。

+0

JSON只允許使用雙引號而不是單引號。 http://json.org/ – James 2010-01-15 09:47:06

+0

謝謝,我忽略了OP的代碼,更正了。 – YOU 2010-01-15 10:34:38

2

您可以使用字符串或標識符來指定對象中的屬性。你甚至可以將它們混合:

var o = { 'id': 1, name: 'test'} 

兩種途徑都給予同樣的結果(所不同的是,你還可以當您使用字符串中使用關鍵字和分隔符)。

在你可以使用一個標識符或字符串讀取性能類似的方式:

alert(o.id); 
alert(o['name']); 

注意屬性使用字符串創建可以使用標識符,反之亦然,這表明它的讀取只有創建和訪問屬性的不同方式,不管創建方法如何,結果屬性都是相同的。

0

定義這樣的對象時,您只需聲明標識符或變量。標識符有一定的規則,您可以在空閒時間在ECMAScript specification中查看,但兩種表格都是相同的。但是,當您嘗試使用保留或將來的保留關鍵字時,瀏覽器的行爲會有所不同。例如,這些不能用作標識符

break 
do 
instanceof 
typeof 
case 
else 
new 
var 
catch 
finally 
return 
void 
continue 
for 
switch 
while 
debugger 
function 
this 
with 
default 
if 
throwdelete 
in 
try 

並非所有的瀏覽器都會將其標記爲錯誤,但有些可能。還有的未來保留關鍵字列表太:)

class 
enum 
extends 
super 
const 
export 
import 

爲了安全起見,並沒有查找規格每一次,我會說其更好地引用您的標識符。要真正發現問題,請在Safari中檢查em',至少在版本4.0.4中使用任何這些關鍵字作爲標識符。例如,請嘗試以下:

var class = "my class"; 

不會在一個簡單的聲明或JSON對象類型聲明中工作:

var myObject = { 
    goodProperty: "this works", 
    class: "gimmeh the errarz codez!", 
};