为啥将 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?的主要内容,如果未能解决你的问题,请参考以下文章

将 Go 函数作为回调传递给 C

Ruby - 将方法作为回调传递给 DLL 库

为啥将字符串文字传递给 char* 参数有时只是编译器错误?

React.js + Flux -- 在视图中将回调作为道具传递

为啥将 ClientID 传递给 javascript 函数会传递整个控件?

Delphi x64:如何将本地过程作为过程参数(回调)传递