首先普通for循环就不说了。
- for..in (数组、对象、set、map)不推荐,建议使用keys()
- 用于遍历对象obj的键名key,或数组arr的index(不推荐用于数组)
- 会遍历原型链上的属性,忽略 可枚举性
enumerable
为false
的属性。- 缺点1:数组的键名是数字,但是
for...in
循环是以字符串作为键名“0”、“1”、“2”等等。- 缺点2:
for...in
循环不仅遍历数字键名,还会遍历手动添加的其他键,包括原型链上的键。- 缺点3:某些情况下,
for...in
循环会以任意顺序遍历键名。
// 有四个操作会忽略enumerable为false的属性。
// 1、for...in循环: 只遍历对象自身的和继承的可枚举的属性。
// 2、Object.keys(): 返回对象自身的所有可枚举的属性的键名。
// 3、JSON.stringify():只串行化对象自身的可枚举的属性。
// 4、Object.assign(): 只拷贝对象自身的可枚举的属性。
- for...of (数组、set、map)
- 用于遍历数组或类数组的键值
- 只会遍历自身的属性
- 不同于
forEach
方法,它可以与break
、continue
和return
配合使用
- forEach (数组、set、map)
- 回调3个参数value,index,arr(原数组)
- 回调函数内可以操作,改变原来数组
- 无法中途跳出
forEach
循环,break
命令或return
命令都不能奏效。
- map() (数组、set、map)
- 回调3个参数value,index,arr(原数组)
- 需要return,会返回一个新数组,支持链式操作
- keys()、values()、entries() (对象、数组、set、map)
- 对象、数组,使用 Object.keys(obj) 这种方式
- 数组、set、map,使用obj.keys(),(其中set的keys和values是一样的),三种使用方法相同,如下图所示:
参考:阮一峰es6