以下 JavaScript 导致运行时在 OSX 10.15.2 上的 Chrome (v80.0.3987.116) 和 Firefox (v72.0.2) 上挂起。
为什么?
请注意,我将迭代器函数标记为async.
const iterable = {
async *[Symbol.iterator]() {
yield 'one'
}
}
console.log([...iterable])
Run Code Online (Sandbox Code Playgroud)
因为现在您的[Symbol.iterator]方法不再返回 Iterator,而是返回 AsyncIterator。这仍然是一个带有方法的对象.next(),因此尝试迭代它的扩展语法不会抱怨。但是对该方法的调用.next()不再返回{value:\xe2\x80\xa6, done:true}对象,它们总是返回一个承诺。这些 Promise 对象没有 truedone属性,因此你的迭代器永远不会停止\xe2\x80\xa6
您可以使用以下方法获得相同的结果
\n\nconst iterable = {\n *[Symbol.iterator]() {\n while (true) {\n yield\n }\n }\n} \nconsole.log([...iterable])\nRun Code Online (Sandbox Code Playgroud)\n\n或者
\n\nconst iterable = {\n [Symbol.iterator]() {\n return {\n next() {\n return {};\n }\n }\n }\n}\nconsole.log([...iterable])\nRun Code Online (Sandbox Code Playgroud)\n