一、总结
- 相同点:都是串行遍历。
- 不同点:
二、for of循环
- 设计目的:遍历所有数据结构的统一方法。
- 原理:会调用数据结构的Symbol.iterator方法。
- 只要数据结构定义了Symbol.iterator属性,就能用for of遍历它的成员。
- 换句话说,只要能被for of遍历,数据结构上一定有Iterator接口。
- 适用范围:数组、set、map、类数组(arguments对象、Dom NodeList对象)、生成器对象、字符串。
- 可以中断(支持break/continue), 支持return。
- 数组的遍历器:只返回能通过数字下标访问的属性。
三、for in循环
-
为了遍历对象而设计。能够遍历数组的key。
-
缺点:
- 数组的索引是数字,但是for in里拿到的键值是字符串。
- for in还会遍历数组上挂载的其他属性;如果数组原型被重写(新增变量),还会访问到原型链上的值。
- 特殊场景:如果对象键值是数字,则会按照键值的升序来遍历。
四、map forEach
相同点:
- 为了解决for遍历数组,写法太麻烦。
- 无法中途跳出循环。break、continue都不支持。
不同点:
- map支持return, 会新开辟内存接收返回值。
- forEach不支持return, 没有返回值。