一道解构的面试题

43 阅读2分钟

迭代器和生成器

迭代器是一种对象,它提供了一种顺序访问集合中每个元素的方式,而不暴露集合内部的表示。 通过调用迭代器的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);

参考来源

cloud.tencent.com/developer/a…

www.bilibili.com/video/BV1Am…