2011-04-26 58 views
5

可以永遠存在的差異:JavaScript對象字面:屬性名稱作爲字符串與 「原始」

var x = { 
    hello: 'world' 
}; 

var x = { 
    'hello': 'world' 
}; 

也就是說,在什麼情況下,賦予屬性名稱作爲字符串的結果與將其作爲「原始」名稱的結果不同?例如,我知道var x = {}; x['@£$%'] = 'bling!';是有效的(因爲任何字符串都可以是屬性),但[email protected]£$% = 'bling!'不起作用。也不會語言的關鍵字或保留的關鍵字作爲屬性名稱(所以var x = {for: 'good', class: 'y'};將無法​​正常工作。

還有別的嗎?

例如,如果

var hello = 'goodbye'; 

在上面的例子中定義?還是什麼否則,像

function hello() { 
    return 'goodbye'; 
} 

爲了安全起見,我是否應該始終使用我的財產名稱字符串?

+0

看一看[這個問題](http://stackoverflow.com/questions/2348867/why-are-s ome-object-literal-properties-quoted-and-others-not) – Flash 2011-04-26 02:53:30

回答

3

我幾乎從不指定任何超出a-zA-Z的東西作爲我的密鑰,所以我不擔心字符,如@。如果因爲任何原因你真的需要這些角色,那麼確定繼續並使用引號。

如果肯定的關鍵詞是一個reserved word甚至遠程認爲它可能是,只是把它包在引號和安全..否則,只是去quoteless和節省打字時間。

與您的密鑰具有相同名稱的變量絕對沒有影響,因爲它的字面意義。

var hello = 'god'; 
({hello:2})['hello'] // 2 
1

在對象文字中,可以使用字符串文字(帶引號)或標識符(不帶引號)。在第一種情況下,您可以使用您喜歡的任何字符,而在第二種情況下,您必須遵循ECMAScript spec中規定的標識符規則。使用點符號屬性訪問器時適用相同的標識符規則。簡化概述:

  • 標識符必須以字母開頭,_$(兩者也可以在任何地方出現在標識符)
  • 的第一個字符之後,更多的字符是允許的,包括數字
  • 標識符不能是保留字(newvarfunctiondelete等)
+0

爲什麼不是這個答案upvoted更多? – 2017-03-16 21:26:12

相關問題