【问题标题】:var i = [0] in a for loop, then incremented i++ - why does it work?var i = [0] 在 for 循环中,然后递增 i++ - 为什么它会起作用?
【发布时间】:2015-11-29 16:45:10
【问题描述】:

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

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 的类型从 object(毕竟在第一次迭代中它是一个数组)更改为 number . 这是迄今为止我从未遇到过的一种隐式类型转换(谷歌并没有多大帮助)。谁能解释一下幕后发生了什么?

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 ...
}

【问题讨论】:

    标签: javascript for-loop type-conversion


    【解决方案1】:

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

    1. oldValueToNumber(GetValue(lhs))。

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

    【讨论】:

    • @Tadek:这更像是一个令人困惑的功能。规范说明了这一点,因此增加 '1' 将导致 2 而不是 '11'
    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2011-07-27
    相关资源
    最近更新 更多