你能解釋JavaScript表達式如何:JavaScript表達式[1 [{}]]究竟如何解析?
[1 [{}]]
解析/評估板?在Firefox,Chrome,Konqueror和rhino中,它似乎創建了一個包含單個元素的數組undefined
。但是,我不明白爲什麼。
在Firefox:
[1 [{}]].toSource()
產生
[(void 0)]
與其他JavaScript值替換1似乎產生相同的結果。
更新:我想我現在明白了。 codeka,Adrian和CMS澄清了事情。至於標準,我試圖通過的ECMAScript 5
1 [{}]
走路是一個屬性訪問器,所以它的覆蓋§11.2.1。baseReference
是評估結果1
,所以仍然1
。baseValue = GetValue(baseReference) == 1
。- 在
GetValue
(§8.7.1),Type(1)
不是Reference
(解析的名稱綁定),所以返回1 propertyNameReference
是評估{}
,所以空對象的結果。propertyNameValue = GetValue(propertyNameReference) == {}
- 在
CheckObjectCoercible(baseValue)
(§9.10),我們返回(Number是對象強制的)。 propertyNameString = ToString(propertyNameValue)
- 在
ToString
(§9.8),返回ToString(ToPrimitive({}, hint String))
- 在
ToPrimitive
(第9.1節),對象的[[DefaultValue]]
的返回結果,通過PreferredType
(串)。 - 在
[[DefaultValue]]
(§8.12.8),令toString爲[[Get]]
的結果,其參數toString
。 - 這是在§15.2.4.2定義的,返回
"[object " + [[Class]] + "]"
,其中[[Class]]
是默認對象原型的「Object」。 - 由於有一個可召集的
toString
,我們稱它爲this
爲{}
。 - 返回類型爲
Reference
的值,其基值爲BaseValue
(1),其參考名稱爲propertyNameString
("[object Object]"
)。
然後,我們轉到數組初始值設定項(第11.1.4節),並用結果構造單個元素數組。
我不知道爲什麼,這將是有效的JavaScript ...所以你得到發動機*試圖*處理它的不可預知的結果。 ..似乎對我來說很正常。 – 2010-06-21 00:24:12
@尼克,我也懷疑它是有效的JS,並且我願意接受它可能只是未定義的行爲。但是,所有4個引擎(它們都有獨立的實現)以相同的方式解析它的事實至少是有趣的。 – 2010-06-21 00:31:44
@Matthew - Adrian的回答是對這4個瀏覽器中行爲的一個很好的解釋,但我仍然不認爲'[object]'是一個有效的訪問器,儘管...所以它仍然取決於每個引擎如何會處理這種情況。儘管這是一個邊緣案例,我無法在3.1規範中找到任何說明它應該如何處理的內容。 – 2010-06-21 00:55:17