枚举和迭代——借由for-in和for-of说明

枚举和迭代有什么区别?

  • for-in 是遍历所有可枚举属性(包括原型链上的)
1
2
3
4
5
6
7
8
9
let obj = {
a: 'aaa',
b: 'bbb'
}
Object.prototype.c = 'ccc'
console.log(obj);
for(let i in obj){
console.log(i);
}
1
2
3
4
Object.defineProperty(obj,'d',{
value: 'ddd',
enumerable: false
}) //d属性枚举不到

🔗更多关于枚举

所以enumberable决定了属性能不能被枚举到
而可迭代性是由各种类型里内置的迭代器工厂函数决定的

详见:🔗迭代器-生成器

  • for-of 是迭代,要有迭代器才能用
1
2
3
4
5
//比如迭代一个Object类型会报错,因为Object没有实现Iterable接口不可迭代
console.log(obj); //{a: 'aaa', b: 'bbb', d: 'ddd'}
for (let x of obj){
console.log(x);
} //Uncaught TypeError: obj is not iterable

手写一个伪数组迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

const { range } = require("lodash");

let fakeArr = {
0: 'a',
1: 'b',
2: 'c',
length: 3,

}
//赋值号右边是一个生成器函数
Object.prototype[Symbol.iterator] = function* () {
for (i in range(0, this.length)) {
yield this[i]
}

}

for (let item of fakeArr) {
console.log(item);
}