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

标签 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. 为什么整个循环都有效?

当然,如果您将 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 ...
}

最佳答案

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

  1. Let oldValue be ToNumber(GetValue(lhs)).

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

关于javascript - var i = [0] 在 for 循环中,然后递增 i++ - 为什么它有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32382569/

相关文章:

javascript - 上传图片到火力地堡

c++ - 如何在 C++11 中将 unix 时间戳字符串正确转换为 time_t?

java - 一旦我生成了一个范围内的随机 Int,我如何将该整数分配给字母表中的每个字母?

c++ - 在 for 循环中,条件中使用的变量是在每次迭代时检查,还是仅在第一次迭代时检查?

java - For 循环嵌套在另一个 for 循环中

c++ - 使用 stringstreams 将字符串转换为 __uint128_t

javascript - 用 js 函数 window.history.back() 添加一个参数

javascript - this.form.submit(); 是否有更好的 jQuery 解决方案?

javascript - 如何在每个组件上激活可调整大小的事件(一一)

windows - `forfiles`在什么时候枚举了一个目录(树)?