我无意中目睹了这导致V8(Chrome、Node.js等)出错的原因:
for (let val of Symbol()) { /*...*/ }
类型错误:Symbol不是函数或其返回值不可迭代
似乎任何其他不可迭代的值(包括函数)都会导致另一个错误:
for (let val of function () { throw 'never called' }) { /*...*/ }
TypeError: (中间值) 不可迭代
正如参考文献所述,此错误仅适用于Chrome:
TypeError: 'x' 不是函数或其返回值不可迭代(Chrome)
...
作为for ... of的右侧或Promise.all或TypedArray.from等函数的参数给出的值不是可迭代对象。可迭代对象可以是内置可迭代类型,如Array、String或Map,生成器结果或实现可迭代协议的对象。
似乎没有预期在列出的任何东西中接受函数作为可迭代对象而不是参数,因此不清楚为什么错误强调函数类型。
这个错误有意义吗?在其上下文中是否存在“不是函数”备注有意义的情况?
for (let val of (function () {})()) { }
- 在您的示例中没有调用该函数。 - jonrsharpefor (let val of Number(1)) {}
和for (let val of Boolean(true)) {}
会发出相同的错误。而for (let val of 1) {}
和for (let val of true) {}
则不会。 - Ben Aston[...Symbol()]
会抛出相同的 TypeError,我在这里删除我的答案并继续讨论。 - Robert Mennell