为啥将 Array.from 作为回调传递给 Array.flatMap 时出现 TypeError: 0 is not a function?
Posted
技术标签:
【中文标题】为啥将 Array.from 作为回调传递给 Array.flatMap 时出现 TypeError: 0 is not a function?【英文标题】:Why do I get TypeError: 0 is not a function when passing Array.from as a callback to Array.flatMap?为什么将 Array.from 作为回调传递给 Array.flatMap 时出现 TypeError: 0 is not a function? 【发布时间】:2021-10-31 22:11:05 【问题描述】:将 Array.from 作为回调传递给 Array.flatMap 会导致错误:“TypeError: 0 is not a function”
const x = ["12"].flatMap(Array.from)
console.log(x)
尽管这个 Array.from 可以正常用作函数:
const f = Array.from
console.log(f("12"))
我找到了解决方法:
const x = ["12"].flatMap(e => Array.from(e))
console.log(x)
我希望有人告诉我:
-
为什么会出现错误?
为什么我会收到如此无用的错误消息?
【问题讨论】:
在 Safari 中,错误信息更有帮助:“TypeError: Array.from 要求第二个参数在提供时是一个函数” 与Why does parseInt yield NaN with Array#map? 重复,原因相同。 我不认为这是重复的,因为有人在谷歌上搜索 Array.from 和 Array.flatMap 的问题不太可能查看有关 parseInt 的问题 【参考方案1】:Array.from
最多接受 3 个参数,第二个是 map 函数,而 .flatMap
将迭代索引作为第二个参数传递给它。
因此,在第一次迭代中,Array.from
将接收 0
作为第二个参数,这确实不是Array.from
所期望的函数。
为了更清楚地展示它,这里有一个 sn-p。这一行:
["12"].flatMap(Array.from);
在功能上等同于:
Array.from("12", 0, ["12"]);
这是 Array.from
的错误签名。
【讨论】:
能否请您添加一个 sn-p 证明 Array.flatMap 将 3 个值传递给回调?例如:flatMap((...args) => console.log(args)) 没问题【参考方案2】:这是因为 flatMap 将超过 1 个参数传递给回调。第二个参数是元素的索引。 Array.from 函数在第二个参数中需要一个替换函数。所以这个缩短的版本通过一个索引来代替一个函数。
你所做的相当于调用:
Array.from("12", 0)
而不是像这样的适当替换器:
console.log(Array.from("12", x => x + x));
【讨论】:
以上是关于为啥将 Array.from 作为回调传递给 Array.flatMap 时出现 TypeError: 0 is not a function?的主要内容,如果未能解决你的问题,请参考以下文章
为啥将字符串文字传递给 char* 参数有时只是编译器错误?
React.js + Flux -- 在视图中将回调作为道具传递