javascript - `for..of`循环如何从一个对象解析迭代器?

标签 javascript iterator ecmascript-2017 for-of-loop

对于实现可迭代接口(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.

所以基本上有两个问题:

  1. 如何从对象中获取迭代器?
  2. 在规范的什么地方规定了?

最佳答案

具体操作指定的地方在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

  1. Let keyResult be the result of performing ForIn/OfHeadEvaluation(BoundNames of ForDeclaration, AssignmentExpression, iterate).
  2. Return ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, iterate, lexicalBinding, labelSet).

在这里,您可以看到传递给 ForIn/OfBodyEvaluation 的迭代器参数是ForIn/OfHeadEvaluation的返回值keyResult .返回值为,在步骤 7b 中:

b. Return GetIterator(exprValue).

因此,for-of 循​​环通过访问@@iteratorSymbol.iterator 规范的众所周知的符号来获取迭代器。

关于javascript - `for..of`循环如何从一个对象解析迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46665566/

相关文章:

ecmascript-6 - (ES6) 类 (ES2017) 异步/等待 getter

javascript - jQuery .each() 没有按预期迭代字符串数组

javascript - ajax 论坛上的无状态(pushState?)后退按钮

javascript - 即使在数据更改期间也会触发 knockout 点击事件

javascript - 元素 slider 从 0 开始到底部(负)而不是 0 到 Firefox 中的顶部

c++ - 复制三重嵌套容器

java - 如何用给定大小的批处理迭代器

c++ - 用于 C++ 的 Eclipse 自动完成迭代器

javascript - axios获取URL参数字符串不接受

javascript - 在类里面开 Jest 测试胖箭缺少这个