先讲for

我觉得这应该是最古老而且实用性最强的for了,就是三段式定义。for (;;)
想到当年考java编程基础的时候(一门学科),有一道手写题要用到循环,我抬手就是for (var ...)

1
for (let i;i<len;i++)

其中不管怎样,常规for必须要两个;,因为就是这样,里面有三段式嘛。第一个是定义自走变量,第二个是条件,第三个是自加或自减。实际上for应该是这样的

1
for (let i;let len;i<len;++i)

for…in

这个在上次总结对象遍历已经提到了,它好像也就遍历对象用得多一点。

1
for (let i in sth) {}

不过for in的话,为什么说遍历对象比较多,其中一个除了好写~~(打死吧这人)~~,还有一点它只能用来遍历有key或者说是个index的东西,比如数组,它只能读到数组的index,那对象的话就直接读到键值咯。而且有一点的是,你读数组,读出来的index是个string不是number。这个要记得,因为js这种弱类型的东西,如果索引相加就变成字符串相加了……(我幼儿园就会20以内加减法了,1加2等于12)

forEach

这个方法就不是古老的方法了,JS(ES5)版本的时候的,针对数组的一个方法

1
arr.forEach((i)=> {})

这种遍历的话,你遍历完直接能把数据处理掉最好,因为如果不是的话就麻烦了…它并不是一个开放的遍历,而是借用的闭包函数做的遍历。可以看成是arr.func(),它是一个数组方法,传进去一个callback,那就厉害了啊,闭包一个特点就是保护变量避免污染啊,变量保护是双向的啊…进得去出不来… (所以我的微信小程序openradio有用到计数器的时候不敢用这个,而且这个方法也是针对数组才能用的)

for…of

这是ES6的新东西,它比for in遍历的更多,没有for (;;)复杂,对比forEach它是开放的不是闭包,也就是那些条件控制流什么的都可以操作。

1
for (let i of arr)

可是不止,好像还可以

1
2
3
for (let i of 'colmu') {
console.log(i) //'c'\n 'o'\n 'l'\n 'm'\n 'u'\n
}

不过它不能遍历对象!不能遍历对象!不能遍历对象!而且错误信息TypeError: str[Symbol.iterator] is not a function。所以这里我不行不BB了。

所有实现了[Symbol.iterator]接口的对象都可以被遍历。

for in 和 for of 对比

一个栗子就能锤到头皮发麻

1
2
3
4
let arr = [6,6,4,2,8]
for (let i in arr) {
console.log(i) // 0,1,2,3,4
}
1
2
3
4
let arr = [6,6,4,2,8]
for (let i of arr) {
console.log(i) //6,6,4,2,8
}

summary

光说区别不行,我要讲怎么用!

万能膏药while (不对走错片场…)

万能膏药for (;;):这是怎样都能用的,不过就是长了点,但是定义细了多。

数组专利forEach:数组的方法,只能用在数组。

能用在数组的:for, forEach, for in, for of

能用在找头的:for in

只要支持[Symbol.iterator]要什么找什么的:for of