“'x' 不是函数或其返回值不可迭代”错误的含义

Est*_*ask 12 javascript google-chrome v8 node.js for-of-loop

我无意中看到这会导致 V8(Chrome、Node.js 等)中的错误:

for (let val of Symbol()) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

类型错误:符号不是函数或其返回值不可迭代

似乎任何其他不可迭代的值(包括函数)会导致另一个错误:

for (let val of function () { throw 'never called' }) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

类型错误:(中间值)不可迭代

正如参考资料所述,该错误特定于 Chrome:

类型错误:“x”不是函数或其返回值不可迭代(Chrome)

...

作为 for...of 的右侧或作为 Promise.all 或 TypedArray.from 等函数的参数给出的值不是可迭代对象。可迭代对象可以是内置的可迭代类型,例如 Array、String 或 Map、生成器结果或实现可迭代协议的对象。

似乎没有列出的东西会接受一个函数而不是 iterable 作为参数,所以不清楚为什么错误强调函数类型。

这个错误有什么意义吗?在什么情况下,is not a function评论在其上下文中有意义?

jmr*_*mrk 6

是的,错误消息的两个部分都有含义。在您手头的情况下, 的返回值Symbol()是不可迭代的,所以这是第二个选项。作为第一个选项的示例,只需使用不是函数的东西:

let NotAFunction = {};  // Or any other object.
for (let val of NotAFunction()) {}
Run Code Online (Sandbox Code Playgroud)

给出:Uncaught TypeError: NotAFunction is not a function or its return value is not iterable. 在这种情况下,显然,NotAFunction它不是一个函数;-)

我不知道为什么没有两个单独的错误消息“它根本不是一个函数”和“它是一个函数并且已被调用,但其返回类型不可迭代”。据推测,实现for..of循环的内部逻辑中的某些东西使得更细粒度的错误报告变得异常复杂——因此组合的错误消息只是提到了循环不起作用的两个可能原因。