在我读过的一本书(JavaScript和JQuery - Jon Duckett的交互式前端开发)中,有一个有趣的错误或者(至少我认为是这样)并没有停止来自工作的代码:
for (var i = [0]; i < options.length; i++) {
addEvent(options[i], 'click', radioChanged);
}
这是脚本的一部分,它遍历表单中的所有单选按钮并附加事件监听器(它并不重要)。
但是...
为什么我初始化为数组?
为什么增量有效?
为什么整个循环都有效?
当然,如果用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 ...
}
答案 0 :(得分:8)
++
运算符在递增之前将其操作数转换为数字的规范says (§ 11.3.1):
- 让 oldValue 为
醇>ToNumber
(GetValue
( lhs ))。
在对象上调用时,GetValue
内部操作将调用toString()
,对于数组,它将加入其元素,返回'0'
。