從語言設計的角度來看,爲什麼爲什麼如果('k'在42); (42中的'k')拋出異常;不,在JavaScript中?
if ('k' in 42);
拋出一個異常TypeError
而
for ('k' in 42);
不?
我讀過ECMAScript中規格以下幾個部分:
有人能解釋具有這種不一致的理由?
爲什麼不能表達'k' in 42
在if (...)
只是評價爲false
?
從語言設計的角度來看,爲什麼爲什麼如果('k'在42); (42中的'k')拋出異常;不,在JavaScript中?
if ('k' in 42);
拋出一個異常TypeError
而
for ('k' in 42);
不?
我讀過ECMAScript中規格以下幾個部分:
有人能解釋具有這種不一致的理由?
爲什麼不能表達'k' in 42
在if (...)
只是評價爲false
?
重新閱讀本節。
If Type(rval) is not Object, throw a TypeError exception.
42不是一個對象,這是一個數量
typeof 42 // 'number'
typeof new Number(42) // 'object'
換在聲明中不需要的對象,事實上,它實際上是將其轉換爲對象
Let obj be ToObject(experValue).
我不認爲這是這種行爲背後的原因,這可能是一個設計缺陷(不一致)
我相信k這裏是'運營商'(in
)和'聲明'(for-in
)之間的區別。如果你檢查標準,你會發現後者僅在寫錯時才拋出錯誤。在嚴格模式下拋出SyntaxError(!)的with
情況非常明顯。
顯然你不能猜測for (var x in someExpr)
是否寫錯了,除非你先評估someExpr
。
'with'是什麼意思? – Bergi
順便說一句,在ES3中是一樣的。 – raina77ow
你的意思是「對(42中的k)」?字符串文字「k」在該位置上甚至在語法上都不是有效的。 – Bergi