ES6-Symbol.iterator 迭代器

  目录

ES6-Symbol.iterator 迭代器原理剖析

ES6-Symbol.iterator 迭代器

一个数据结构只要部署了Symbol.iterator属性就能使用 for…of遍历 与 …运算符 操作
Object身上没有Symbol.iterator,当直接使用时会报错

1
2
3
4
5
6
7
8
9
let obj = {
0: 'a',
1: 'b',
2: 'c',
}
console.log([...obj])//报错obj is not iterable <br>     在没有Symbol.iterator方法下运行
for(let p of obj){
console.log(p);//TypeError: obj is not iterable
}

Array身上天生具备Symbol.iterator

1
2
3
let arr = [1,2,3,4];
// 数组,天生具备Symbol.iterator方法所以可以使用
console.log([...arr]);//(4) [1, 2, 3, 4]

而我们Object需要用到…运算符 与 for of遍历怎么办呢
如果我们要使用它的话,Object身上需要有一个Symbol.iterator属性代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let obj = {
0: 'a',
1: 'b',
2: 'c',
length: 3,
[Symbol.iterator]: function () {
// index用来记遍历圈数
let index = 0;
let next = () => {
return {
value: this[index],
done: this.length == ++index
}
}
return {
next
}
}
}
// console.log(obj.length)
console.log([...obj]);//(2) ["a", "b"]
for(let p of obj){
console.log(p) //"a" "b"
}