2013-05-07 22 views
4

1:{key:value}["key"]
2:({key:value})["key"]
我想知道的JS解釋器是如何工作的在上面的代碼,爲什麼不起作用,爲什麼作品?爲什麼{key:value} [「key」]不起作用?

+2

因爲這就是語法的定義方式。 – Phrogz 2013-05-07 02:53:05

+0

根據解釋器的不同,可能會接受一些非標準代碼,或者可能會有一些不符合標準的舊實現。我認爲它們必須出於同樣的原因,當人們將函數放在paranthesis中時(function(){alert(「東西「);})() – Zelenova 2013-05-07 02:58:53

回答

4

我假設你問這個問題是因爲你在JavaScript REPL(shell)中看到了這個效果。您正在使用一個JavaScript shell,它假設前導「{」開始一個塊語句而不是對象字面值。

例如,如果您使用的是自帶的Chrome瀏覽器的JavaScript解釋器,你看到以下內容:

> {key:"value"}["key"] 
["key"] 

這裏,瀏覽器看到了您輸入的語句塊,緊接着就是爲表達一個元素的數組,字符串爲"key"。所以它迴應了該表達式的結果,即陣列["key"]

但並非所有的炮彈都以這種方式工作。如果您使用node.js解釋器,那麼#1 爲您工作!

$ node 
> {key:"value"}["key"] 
'value' 
> 

在Chrome等口譯員,你必須使用括號來告訴它你想要的第一部分是一個對象字面量。 (順便說一下,這種技術保證在全部炮彈,包括節點的工作)。

編輯

作爲一個評論指出的那樣,如果你使用的是在表達方面的任何地方在實際的腳本構建,它會產生"value"。它在外殼中的使用看起來很混亂。

這個事實實際上是在Gary Bernhardt着名的WAT video中被利用的。

+0

號碼2也將工作在節點 – aaronman 2013-05-07 02:55:35

+0

#1在瀏覽器也能正常工作,只是不在eval上下文(控制檯)。 http://jsfiddle.net/qpnMw/ – 2013-05-07 02:56:50

+0

是的。這值得添加答案。 – 2013-05-07 02:58:29