2015-09-03 53 views
7

在一本書,我讀(JavaScript的& JQuery的 - 互動前端由喬恩·達克特發展)有一個有趣的錯誤或(至少我是這麼認爲的)不停止工作的代碼:var i = [0]在for循環中,然後增加i ++ - 爲什麼它工作?

for (var i = [0]; i < options.length; i++) {   
    addEvent(options[i], 'click', radioChanged);  
} 

這是腳本的一部分,它循環遍歷表單中的所有單選按鈕並附加一個事件監聽器(它並不重要)。

但是......

  1. 爲什麼我初始化爲數組呢?

  2. 爲什麼增量起作用?

  3. 爲什麼整個循環工作?

當然,如果用var i = 0替換var i = [0],代碼仍然可以工作。

當您添加一些警報來檢查循環的每次迭代中的i的值和i的類型時,在第二次迭代中,i的類型從對象(在第一次迭代中它是一個數組)後更改爲數。 這是一種隱式類型轉換,我從來沒有遇到過(和谷歌沒有多大幫助)。任何人都可以解釋底下發生了什麼?

for (var i = [0]; i < options.length; i++) {   
    addEvent(options[i], 'click', radioChanged); 
    alert(i); // --> 1 2 3 ... 
    alert(type of i); // --> object number number ... 
} 

回答

8

該規範says (§ 11.3.1)++操作其操作數轉換成數字之前遞增:

  • 屬性oldValueToNumberGetValueLHS ))。
  • 當在對象上調用的GetValue內部操作將調用toString(),其中,對於一個陣列,將加入其元素,返回'0'

    +0

    好的,謝謝:)所以我想這是一種小錯誤,但不是'錯誤'... – Tadek

    +0

    @Tadek:這更多的是一個令人困惑的功能。規範說這是爲了增加「1」會導致「2」而不是「11」。 – SLaks

    相關問題