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

问题描述 投票:2回答:1

我不小心目睹了这在V8(Chrome、Node.js等)中会导致一个错误。

for (let val of Symbol()) { /*...*/ }

TypeError: 符号不是函数或其返回值不可迭代

似乎任何其他不可读写的值(包括函数)都会导致另一个错误。

for (let val of function () { throw 'never called' }) { /*...*/ }

TypeError: (中间值)不可迭代。

作为 参考文献 表示,该错误是 Chrome 浏览器特有的。

类型错误:'x'不是一个函数或其返回值不可迭代(Chrome)。

...

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

似乎所列出的东西都不应该接受函数而不是可迭代对象作为参数,所以不清楚为什么错误强调了函数类型。

这个错误有什么意义吗?是否在某些情况下 is not a function 注释在其上下文中是否有意义?

javascript node.js google-chrome v8 for-of-loop
1个回答
2
投票

是的,错误信息的两个部分都有意义。在你手头的情况下,返回值为 Symbol() 是不可迭代的,所以这是第二个选项。作为第一个选项的例子,只需拿一个不是函数的东西来说明。

let NotAFunction = {};  // Or any other object.
for (let val of NotAFunction()) {}

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

我不知道为什么没有 "它根本不是一个函数 "和 "它是一个函数,而且已经被调用了,但它的返回类型不是可迭代的 "这两个不同的错误信息。大概是内部逻辑中出现了一些问题,要实现 for..of 循环让细粒度的错误报告变得非常复杂--所以合并后的错误信息只是简单地提到了循环不工作的两个可能原因。

© www.soinside.com 2019 - 2024. All rights reserved.