2015-09-03 55 views
7

在一本书,我读(JavaScript的& JQuery的 - 互动前端由乔恩·达克特发展)有一个有趣的错误或(至少我是这么认为的)不停止工作的代码:var i = [0]在for循环中,然后增加i ++ - 为什么它工作?

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

回答

8

该规范says (§ 11.3.1)++操作其操作数转换成数字之前递增:

  • 属性oldValueToNumberGetValueLHS ))。
  • 当在对象上调用的GetValue内部操作将调用toString(),其中,对于一个阵列,将加入其元素,返回'0'

    +0

    好的,谢谢:)所以我想这是一种小错误,但不是'错误'... – Tadek

    +0

    @Tadek:这更多的是一个令人困惑的功能。规范说这是为了增加“1”会导致“2”而不是“11”。 – SLaks

    相关问题