如何理解这段js for循环

fns = [1,2,3,5,8]
for(var i = 0,fn;fn=fns[i++];) {
 console.log("我是i = "+i , "我是fn = "+fn)
}

控制台输出
 我是i = 1 我是fn = 1
 我是i = 2 我是fn = 2
 我是i = 3 我是fn = 3
 我是i = 4 我是fn = 5
 我是i = 5 我是fn = 8

为什么与我通常见到的for循环不一样for(var i = 0;i<10;i++)

阅读 3k
4 个回答

var i=0,fn 定义变量
fn = fns[i++] 退出循环条件同时i递增 当i大于数组长度时fns[i]undefined退出循环,i++ 返回的是i自加之前的值而后自加,fus[i++]相当于两步 fus[i]i++;

不一样是因为遍历中需要两个遍历变量,一个是i,一个是fn,且fn是依赖i

for(var i = 0,fn; fn=fns[i+1];)可以拆分理解:

  • var i = 0, fn;:声明了变量i赋值为0,声明了变量fn,但没有赋值,为了之后的赋值提前声明避免undefined

  • fn = fns[i++]:也就是说fn为每次i作为key时,数组fns取对应的值

以第一次遍历为例:
i = 0i++下次遍历才会自增,所以此次遍历i还是为0,所以fn = fns[0] = 1
同理第二次遍历:i =1, fn = fns[1] = 2

fn=fns[i++]判断结果如果为false就终止循环,因为fns[6]=underfined。
整个表达为false,所以控制台就输出5个。
其他的按照for循环里的表达式模拟计算即可。

其实这样理解就简单了,看 for 循环的结构

    for(var i = 0;i<5;i++){
        //
    }
    for(<定义变量>;<布尔值>;<自执行代码块>){

    }

    所以只要第二个区间的值为true,那么就会一直执行代码块。

    所以 fn=fns[i++] 就可以控制for循环是否继续执行了
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题