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++)
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++)
不一样是因为遍历中需要两个遍历变量,一个是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 = 0
,i++
下次遍历才会自增,所以此次遍历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循环是否继续执行了
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
var i=0,fn
定义变量fn = fns[i++]
退出循环条件同时i
递增 当i大于数组长度时fns[i]
为undefined
退出循环,i++
返回的是i
自加之前的值而后自加,fus[i++]
相当于两步fus[i]
和i++;