JS 几种循环遍历的方法对比—for…in/for…of/forEach/Object.keys()
for…in
- 作用:用于遍历对象可枚举属性的属性名(包括继承来的属性和用户添加的额外属性,但不包括数组的length属性)
- 对于数组对象,
for...in实际遍历的是数组的index,而并非数组的value
for...in不适用与遍历Map和Set对象
for…of(ES6新增方法)
- 作用:用于遍历可迭代对象(
Array, Map, Set, String, TypedArray, arguments, NodeList)的属性名称,只包含对象本身定义时的属性(不包括继承来的属性和用户后期添加的额外属性)- 对于
Array对象和Set对象,for...of遍历的是他们实际的value值- 对于
Map对象,for...of遍历的是对象中的每一个键值对- 对于
Object对象,for...of不能直接遍历Object对象,可结合Object.keys()来遍历
forEach
forEach()是数组的一个方法,用于遍历数组的每一项,并对每一项执行一个callback函数;forEach()没有返回值,返回值总是undefined。- 对于
Array对象,callback函数为:function(element, index,arr){};- 对于
Set对象,callback函数为:function(element, sameElement, set){};因为它没有index值,所以回调函数的前两个参数都是元素本身。- 对于
Map对象,callback函数为:function(key, value, map){}
forEach中不能中断循环(使用break语句或使用return语句)
Object.keys()
- 作用:返回对象自身可枚举的属性组成的数组,不包括原型链上的属性及Symbol属性
- 对于数组的遍历顺序与for in 一致,但不包括原型链上的部分