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()
。对于字符串和数组会返回数字下标序列。对于数字会返回空序列(不迭代)。