Javascript 中的迭代:ArrayLike, Symbol.iterator……

Iterable

Symbol.iterator 是个特殊的键,属于 Iterator 规范的一部分。实现了 Iterable 接口的对象是可以用 spread operator 迭代的。

ArrayLike

length 属性,且在 [0, length) 范围内都可以访问的对象被称为 ArrayLike 的对象。ArrayLike 的对象可以使用诸如 Array.prototype.slice.call(obj, 2) 的方式来作为 Array 调用。

Array.from 既对 ArrayLike 有效,也对 Iterable 对象有效。

Array 系列方法,比如 map/filter/forEach

需要先转换成 Array。

  • Array.prototype.slice.call:适用于 ArrayLike,可行时效率最高。
  • Array.from:适用于 ArrayLike 和 Iterable。
  • [...obj]:适用于 Iterable。

for-of

需要对象实现 Iterable 接口。

for (const a of {length: 2}) { console.log(a) }
// Uncaught TypeError: ({length:2}) is not iterable

for-in

只要是对象就可以。因为 for-in 会在对象上调用 Object.keys()。对于字符串和数组会返回数字下标序列。对于数字会返回空序列(不迭代)。