犀牛书笔记(第12章 迭代器与生成器)

犀牛书笔记(第12章 迭代器与生成器)

迭代器

可迭代对象:数组(包括Typed Array),Set, Map, 字符串。可以通过for/of迭代,可以用… 扩展操作符展开。某些接收数组对象的内置函数和构造函数,可以接收任意迭代器。

JavaScript中的迭代涉及三个对象,可迭代对象、迭代器对象、迭代结果对象。

可迭代对象指的是任何具有专用迭代器方法,且该方法返回迭代器对象的对象。该方法键名是Symbol.iterator。

迭代器对象是指任何具有next方法,且该方法返回迭代结果对象的对象。

迭代结果对象是具有属性value和done的独享。

let iterable = [99]
let iterator = iterable[Symbol.iterator]()
for (let result = iterator.next(); !result.done; result = iterator.next()) {
    console.lo(result.value)
}

根据 JavaScript 协议,可迭代对象(如数组、Set、Map、字符串等)必须实现一个以 Symbol.iterator 为键的方法。这个方法在被调用时会返回一个迭代器对象(包含 next() 方法)。

return方法:除了next方法,迭代器对象还可以实现return, 如果迭代在next返回的done属性为true的迭代结果之前停止,(最常见的原因是通过break语句提前推出了for/of循环),那么解释器会检查迭代器对象是否有return方法。如果有,解释器会调用这个方法,让迭代器有机会关闭文件、释放内存,或者做一些其他清理工作。

生成器

生成器是指使用ES6语法定义的迭代器,适合迭代计算结果的场景。

用生成器函数来创建生成器。生成器函数:1. 使用function* 关键字。2. 返回一个生成器对象。这个生成器对象是一个迭代器,调用它的next方法会导致生成器函数的函数体从头/从当前位置开始执行,直至遇到一个yield语句。yield语句的值会成为next方法的返回值。

yield和yield* 只能在生成器函数中使用。

生成器函数可以有返回值:

yield表达式也可以有值。

发表回复

*您的电子邮件地址不会被公开。必填项已标记为 。

*
*