这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
for…of 是作为ES6新增的遍历方式,允许遍历一个含有iterator接口的数据结构并且返回各项的值; 而 for...in 是ES3 中的方法,用于获取对象的键名。
它们的区别如下:
for...in
- for ... in 循环返回的值都是数据结构的 键值名。
- 遍历对象返回的对象的key值,遍历数组返回的数组的下标(key)。
- for ... in 循环不仅可以遍历数字键名,还会遍历原型上的值和手动添加的其他键。如——例3
- 特别情况下, for ... in 循环会以看起来任意的顺序遍历键名
- 主要用于遍历对象。
for...of
用来获取一对键值对中的值,原理是遍历对象内部的iterator接口。有iterator接口的有如下类型:
- 数组 Array
- Map
- Set
- String
- arguments对象
- Nodelist对象, 就是获取的dom列表集合
-以上这些都可以直接使用 for of 循环。 凡是部署了 iterator 接口的数据结构也都可以使用数组的 扩展运算符(...)、和解构赋值等操作。
for...of的特点
- 可以代替数组实例的forEach方法,但不同于forEach方法,它可以与break、continue和return配合使用。
- 提供了遍历所有数据结构的统一操作接口。
代码示例
例一 遍历对象
const obj = {
a: 1,
b: 2,
c: 3
}
for (let i in obj) {
console.log(i)
// a
// b
// c
}
for (let i of obj) {
console.log(i)
// Uncaught TypeError: obj is not iterable 报错了
}
例1这个对象,没有 Symbol.iterator这个属性,所以使用 for of会报 obj is not iterable。
如果非要使用for...of的话,可以这样做:## 使用 Object.keys() 获取对象的 key值集合后,再使用 for of
const obj = {
a: 1,
b: 2,
c: 3
}
for (let i of Object.keys(obj)) {
console.log(i)
// 1
// 2
// 3
}
也可以给一个对象部署 Symbol.iterator属性。
例二 遍历数组
const arr = ['a', 'b', 'c']
// for in 循环
for (let i in arr) {
console.log(i)
// 0
// 1
// 2
}
// for of
for (let i of arr) {
console.log(i)
// a
// b
// c
}
例三 for...in遍历键名和手动添加的其他键。
const arr = ['a', 'b']
// 手动给 arr数组添加一个属性
arr.name = 'qiqingfu'
// for in 循环可以遍历出 name 这个键名
for (let i in arr) {
console.log(i)
// 0
// 1
// name
}