迭代器和生成器
迭代器是一种对象,它提供了一种顺序访问集合中每个元素的方式,而不暴露集合内部的表示。 通过调用迭代器的next()方法,可以依次获取集合中的每个元素,并返回一个包含value和done属性的对象。 value表示当前元素的值,done表示是否已经遍历完所有元素。
获取一个数组的迭代器:
let iterator = arr[Symbol.iterator]();
自定义迭代器接口来遍历斐波那契数列
let fibonacci = {
[Symbol.iterator]() {
let pre = 0, cur = 1;
return {
next() {
[pre, cur] = [cur, pre + cur]
return { value: cur, done: false }
}
}
}
}
for (let num of fibonacci) {
if (num > 1000) break
console.log(num)
}
生成器是一种特殊的函数,它使用function*语法进行定义。 在生成器函数内部,可以使用yield关键字来暂停函数的执行,并返回一个包含value和done属性的对象。 value表示yield表达式的值,done表示函数是否已经执行完毕。
生成器提供了一种更灵活、更可控的方式来处理异步编程。 通过使用yield关键字,我们可以在函数执行过程中暂停和恢复, 并且可以将异步操作以同步方式编写和理解。
当我们调用生成器函数时,实际上并不会立即执行函数体内部的代码。而是返回一个迭代器对象, 该迭代器对象实现了next()方法。每次调用next()方法时,生成器会从上一次暂停的位置继续执行代码, 直到遇到下一个yield关键字或者函数结束。
测试:对象的解构赋值给数组
const [a,b] = {
a: 3,
b: 4
}
// 利用生成器返回迭代器对象
Object.prototype[Symbol.iterator] = function* () {
yield* Object.values(this);
}
// 迭代器
Object.prototype[Symbol.iterator] = function() {
return Object.values(this)[Symbol.iterator]();
}
console.log(a, b);