在for循环中var i = [0],然后在i ++中递增 - 为什么它起作用?

时间:2015-09-03 18:03:45

标签: javascript for-loop type-conversion

在我读过的一本书(JavaScript和JQuery - Jon Duckett的交互式前端开发)中,有一个有趣的错误或者(至少我认为是这样)并没有停止来自工作的代码:

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

这是脚本的一部分,它遍历表单中的所有单选按钮并附加事件监听器(它并不重要)。

但是...

  1. 为什么我初始化为数组?

  2. 为什么增量有效?

  3. 为什么整个循环都有效?

  4. 当然,如果用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 ...
    }
    

1 个答案:

答案 0 :(得分:8)

++运算符在递增之前将其操作数转换为数字的规范says (§ 11.3.1)

  
      
  1. oldValue ToNumberGetValue lhs ))。
  2.   

在对象上调用时,GetValue内部操作将调用toString(),对于数组,它将加入其元素,返回'0'