侧边栏壁纸
博主头像
我的学习心得 博主等级

行动起来,活在当下

  • 累计撰写 223 篇文章
  • 累计创建 60 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Symbol.iterator

Administrator
2022-04-03 / 0 评论 / 0 点赞 / 1664 阅读 / 0 字

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

评论区