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

Tad*_*dek 7 javascript for-loop type-conversion

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

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

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

但...

  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 ...
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 8

该规范指出(第11.3.1)++经营者增加前的操作数转换为数字:

  1. oldValue成为ToNumber(GetValue(lhs)).

当调用一个对象时,GetValue内部操作将调用toString(),对于一个数组,它将连接其元素,返回'0'.