Skip to content

生成器和迭代器


生成器

跟ES6中的生成器是一样的

typescript
//1. 生成器 用法一样
function* gen(){
    yield Promise.resolve('rarrot')//同步异步
    yield '666'
    yield '123'
    yield '000'
}

const man=gen()

console.log(man.next())//{ value: Promise { 'rarrot' }, done: false }
console.log(man.next())//{ value: '666', done: false }
console.log(man.next())//{ value: '123', done: false }
console.log(man.next())//{ value: '000', done: false }
console.log(man.next())//{ value: undefined, done: true }

迭代器

迭代器是一个可以由任意对象实现的接口,支持连续获取对象产出的每一个值。任何实现 Iterable 接口的对象都有一个 Symbol.iterator 属性,这个属性引用默认迭代器。默认迭代器就像一个迭代器工厂,也就是一个函数,调用之后会产生一个实现 Iterator 接口的对象,使用这个对象可以调用next()方法。

typescript
// 2. 迭代器
// 3. 用set map做例子
let set: Set<number> = new Set([1, 1, 2, 2, 3, 3])//自动去重
//  Set(3) { 1, 2, 3 }
console.log(set)

let map: Map<any, any> = new Map()
let Arr = [1, 2, 3]
map.set(Arr, 'rarrot')
map.set('1', '你是谁')
console.log(map.get(Arr))//把Arr数组当key,'rarrot'为value,所有输出rarrot

function args() {
    console.log(arguments)//伪数组
}

// let list =document.querySelectorAll('div')//伪数组,如下图

// 自定义for of
const each = (value: any) => {
let It: any = value[Symbol.iterator]()
    let next: any = { done: false }
    while (!next.done) {
        next = It.next()
        console.log("🚀 ~ file: index.ts:39 ~ each ~ next:", next)
        if (!next.done) {
            console.log(next.value)
        }
    }
}

/*
 `  🚀 ~ file: index.ts:39 ~ each ~ next: { value: 1, done: false }
 `  1
 `  🚀 ~ file: index.ts:39 ~ each ~ next: { value: 2, done: false }
 `  2
 `  🚀 ~ file: index.ts:39 ~ each ~ next: { value: 3, done: false }
 `  3
 `  🚀 ~ file: index.ts:39 ~ each ~ next: { value: undefined, done: true }
*/
each(set)


/*
 `  🚀 ~ file: index.ts:39 ~ each ~ next: { value: [ [ 1, 2, 3 ], 'rarrot' ], done: false }
 `  [ [ 1, 2, 3 ], 'rarrot' ]
 `  🚀 ~ file: index.ts:39 ~ each ~ next: { value: [ '1', '你是谁' ], done: false }
 `  [ '1', '你是谁' ]
 `  🚀 ~ file: index.ts:39 ~ each ~ next: { value: undefined, done: true }
*/
each(map)

迭代器的语法糖(for of)

typescript
// 对象不能用for of
for(let value of map){
    // [ [ 1, 2, 3 ], 'rarrot' ]
    // [ '1', '你是谁' ]
    console.log(value)
}

解构

底层原理也是去调用iterator

typescript
let [a,b,c]=[4,5,6]

console.log(a,b,c)//4 5 6

let a1=[4,5,6]
let copy=[...a1]
console.log(...a1) // 4,5,6
console.log(copy)  // [ 4, 5, 6 ]

对象中实现迭代器

其实很简单,就是current的增加,直到current=true才停止,返回value为underfined和done为true。未停止就返回current的值,以及done为false。

typescript
let obj = {
    max: 3,
    current: 0,
    [Symbol.iterator]() {
        return {
            max: this.max,
            current: this.current,
            next() {
                if (this.current == this.max) {
                    return {
                        value: undefined,
                        done: true
                    }
                } else {
                    return {
                        value: this.current++,
                        done: false
                    }
                }
            }
        }
    }
}

for (let value of obj) {
    // 0
    // 1
    // 2
    console.log(value)
}

// 遍历这个对象并将 next() 的返回值收集到数组中
let x = [...obj]
// [ 0, 1, 2 ]
console.log(x)

// 对象解构,执行对象自己的可枚举属性的浅拷贝,它实际上不遍历obj对象。
let o = { ...obj }
/*  
{
   max: 3,
   current: 0,
   [Symbol(Symbol.iterator)]: [Function: [Symbol.iterator]]
}
*/
console.log(o)

Released under the MIT License.