侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

Symbol.iterator

barwe
2022-04-03 / 0 评论 / 0 点赞 / 1,498 阅读 / 782 字
温馨提示:
本文最后更新于 2022-04-03,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Symbol.iterator 用来为对象指定 迭代器,使对象成为 可迭代对象

只有 可迭代对象 才能被 for ... in 和扩展运算符 ... 等遍历取值。

const iterable = [];

iterable[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
}

console.log([...iterable]) // [1, 2]

在上面的例子中,iterable 变量本身是个数组,数组本身其实已经实现了可迭代协议,但是我们重写了它的迭代器,这就导致,即使它本来是个空数组,我们依然能够取出两个值来。由此看来,数组的遍历结果,是由它的迭代器决定的。

关于迭代器可参考 👉 https://barwe.cc/2022/04/03/js-iterable-iterator

下面类的对象原型都实现了可迭代协议:

  • Array.prototype[Symbol.iterator]()
  • TypedArray.prototype[Symbol.iterator]()
  • String.prototype[Symbol.iterator]()
  • Map.prototype[Symbol.iterator]()
  • Set.prototype[Symbol.iterator]()

注意,在某些地方(包括 MDN),会使用 @@iterator 来表示 Symbol.iterator

更一般的,使用 @@ 来表示 Symbol.

👎 如果一个可迭代对象的 @@iterator 方法没有返回 迭代器,这样的迭代是不好的(non-well-formed),它可能在程序运行时产生意料之外的异常。

Reference

👉 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator

0

评论区