2013-12-20 31 views
9

從語言設計的角度來看,爲什麼爲什麼如果('k'在42); (42中的'k')拋出異常;不,在JavaScript中?

if ('k' in 42); 

拋出一個異常TypeError

for ('k' in 42); 

不?

我讀過ECMAScript中規格以下幾個部分:

有人能解釋具有這種不一致的理由?

爲什麼不能表達'k' in 42if (...)只是評價爲false

+0

順便說一句,在ES3中是一樣的。 – raina77ow

+1

你的意思是「對(42中的k)」?字符串文字「k」在該位置上甚至在語法上都不是有效的。 – Bergi

回答

2

重新閱讀本節。

If Type(rval) is not Object, throw a TypeError exception. 

42不是一個對象,這是一個數量

typeof 42 // 'number' 
typeof new Number(42) // 'object' 

換在聲明中不需要的對象,事實上,它實際上是將其轉換爲對象

Let obj be ToObject(experValue). 

我不認爲這是這種行爲背後的原因,這可能是一個設計缺陷(不一致)

+1

'有些人可以解釋這些設計的考慮嗎?'這是一個問題:爲什麼不一致? – raina77ow

+1

@ raina77ow「_我不認爲這是背後的原因,這可能是一個設計缺陷(不一致)_」 – Broxzier

+2

其實我沒有看到任何不一致 - 這兩個表達式有完全不同的目的,因此完全不同的行爲。唯一的缺陷可能是同一個關鍵字'in'被用於兩者。 – Bergi

1

我相信k這裏是'運營商'(in)和'聲明'(for-in)之間的區別。如果你檢查標準,你會發現後者僅在寫錯時才拋出錯誤。在嚴格模式下拋出SyntaxError(!)的with情況非常明顯。

顯然你不能猜測for (var x in someExpr)是否寫錯了,除非你先評估someExpr

+1

'with'是什麼意思? – Bergi

相關問題