对于实现可迭代接口(interface)的对象,它必须实现指向返回 iterator
的函数的 [Symbol.iterator]
键。我想知道 for..of
循环是否在内部调用一个对象的这个方法来获取那个 iterator
?
我很好奇的原因是,例如,Map
定义了一个带有多个迭代器(条目、值、键)的接口(interface),并且如果没有明确指定,似乎 for. .of
循环使用 map.entries()
调用返回的迭代器。
我正在尝试搜索 in the specification但它只指定将iterator
作为参数传递给抽象操作ForOf
:
The abstract operation ForIn/OfBodyEvaluation is called with arguments lhs, stmt, iterator, iterationKind, lhsKind, and labelSet.
所以基本上有两个问题:
- 如何从对象中获取迭代器?
- 在规范的什么地方规定了?
最佳答案
具体操作指定的地方在7.4.1 GetIterator( obj [ , method ] ) .这将获取步骤 1a 中传递的对象的 @@iterator
属性。抽象操作:
a. Set method to GetMethod(obj, @@iterator).
@@iterator
是一个 well-known symbol这是对象的 Symbol.iterator
属性。
由于 13.7.5.11 Runtime Semantics 中的产生式,它被 for-in 和 for-of 循环使用:
IterationStatement : for(ForDeclaration of AssignmentExpression) Statement
- Let keyResult be the result of performing ForIn/OfHeadEvaluation(BoundNames of ForDeclaration, AssignmentExpression, iterate).
- Return ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, iterate, lexicalBinding, labelSet).
在这里,您可以看到传递给 ForIn/OfBodyEvaluation 的迭代器参数是ForIn/OfHeadEvaluation的返回值keyResult .返回值为,在步骤 7b 中:
b. Return GetIterator(exprValue).
因此,for-of 循环通过访问@@iterator
或Symbol.iterator
规范的众所周知的符号来获取迭代器。
关于javascript - `for..of`循环如何从一个对象解析迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46665566/