什么是迭代器? 看个例子
let arr: number[] = [1, 1, 2]
let obj = {
'a': 1,
"b": 2,
"c": 4,
"d": 6,
"e": 5,
"f": 6,
}
let str = '123'
用for of 分别遍历 arr obj 和 str
for (const i of arr) {
console.log(arr[i]);
}
for (const i of obj) {
console.log(i);
}
for (const i of str) {
console.log(i);
}
发现obj没有"Symbol.iterator" 方法 打印原型看看 只有array和str才有
Symbol(Symbol.iterator) 本质上我们调用for of 就在调用Symbol.iterator所以obj才会出现错误提示
在看看Symbol.iterator中到底是什么 以数组为例
let iter = arr[Symbol.iterator]()
console.log(iter);
//调用next()方法
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
这就是传说中的迭代器咯
手搓一个迭代器 以数组为例子
let arr: number[] = [1, 1, 2]
function myIterator(arr: any) {
let index = 0
return {
next() {
return { value: arr[index++], done: index > arr.length ? true : false }
}
}
}
let iter = myIterator(arr)
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());```
对象为什么没有迭代器? 对象的结构可能会很复杂,不知道从哪里遍历开始且是无序的 我们可以修改以上代码对对象的key或value值迭代
手写object迭代器
let obj = {
'a': 1,
"b": 2,
"c": 4,
"d": 6,
"e": 5,
"f": 6,
}
function myIterator(arr: any) {
let index = 0
return {
next() {
return { value: Object.values(arr)[index++], done: index > Object.values(arr).length ? true : false }
}
}
}
let iter = myIterator(obj)
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
或者这样
let obj = {
'a': 1,
"b": 2,
"c": 4,
[Symbol.iterator]() {
let index = 0
let map = new Map()
map.set('a', 1)
map.set('b', 2)
map.set('c', 4)
return {
next() {
//使用map是让其变成一个有序array
let mapEntries = [...map.entries()]
return { value: mapEntries[index++], done: index > mapEntries.length ? true : false }
}
}
}
}
let iter = obj[Symbol.iterator]()
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());