一个对象要实现可迭代接口,必须实现指向返回 iterator
的函数的 [Symbol.iterator]
键。我想知道 for..of
循环是否在内部调用对象上的这个方法来获取 iterator
?
我好奇的原因是,例如,Map
定义了带有多个迭代器(entries、values、keys)的接口,如果没有明确指定,则似乎 for..of
循环使用由 map.entries()
调用返回的迭代器。
我尝试在规范中搜索,但它只指定将 iterator
作为参数传递给抽象操作 ForOf
:
使用参数 lhs、stmt、iterator、iterationKind、lhsKind 和 labelSet 调用抽象操作 ForIn/OfBodyEvaluation。
所以基本上有两个问题:
- 如何从对象中获取迭代器?
- 规范中在哪里指定了它?
map.entries()
调用返回的迭代器。- 不完全正确。它始终使用map[Symbol.iterator]()
,虽然这是与entries
相同的方法。如果您传递一个迭代器对象,它也会在其上调用… [Symbol.iterator]()
, 只是该方法在迭代器实例上返回对象本身(return this;
)。 - Bergi