🗒️iterable object
可迭代对象
一些内置类型是 built-in iterables(内置的可迭代对象),它们具有默认的 iteration behavior,因为它们的 prototype objects 都实现了 @@iterator 方法,该 key 可以通过常量 Symbol.iterator 获得。比如 String, Array, TypedArray, Map, Set, Segments,比如 arguments, NodeList,比如 function*, async function*。
每当一个 object 需要被迭代时(比如 for...of),它的 @@iterator 方法会被调用(不带任何参数),返回的 iterator 用来获取被迭代的值。
const isIterable = obj => obj != null && typeof obj[Symbol.iterator] === 'function';
Array.prototype.hasOwnProperty(Symbol.iterator); // => true
typeof xxx[Symbol.iterator]
2. Iteration protocols
只要遵循一些约定,任何对象都可以实现 Iteration protocols(迭代协议)。
有两种协议:iterable protocol 和 iterator protocol。
iterable protocol,可迭代协议
iterator protocol,迭代器协议
iterable protocol
iterable protocol 允许 JavaScript object 定义或自定义它们的 iteration behavior(迭代行为),例如在 for...of 语句中循环哪些值。
iterator protocol
iterator protocol 定义了一种标准方法,用来生成(有限的或无限的)值序列,可能会返回一个值在生成所有值之后。
当一个 object 实现了具有特定语义的 next() 方法时,它就是一个 iterator。