Why do I get TypeError: 0 is not a function when passing Array.from as a callback to Array.flatMap?

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 不是函数”

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)

我希望有人告诉我:

  1. 为什么会出现错误?
  2. 为什么我会收到如此无用的错误消息?

发生这种情况是因为 flatMap 将超过 1 个参数传递给回调。第二个参数是元素的索引。 Array.from 函数需要第二个参数中的替换函数。所以这个缩短的版本通过索引代替函数。

你所做的相当于调用:

Array.from("12", 0)

而不是像这样的合适的替代品:

console.log(Array.from("12", x => x + x));

Array.from accepts up to 3 parameters, the second one being map function while .flatMap 将迭代索引作为第二个参数传递给它。

因此,在第一次迭代中,Array.from 将接收 0 作为第二个参数,这确实不是 Array.from 期望的函数。

为了更清楚地展示它,这里有一个片段。这一行:

["12"].flatMap(Array.from);

在功能上等同于:

Array.from("12", 0, ["12"]);

这是 Array.from 的错误签名。