开发者问题收集

TypeError:无法将未定义转换为对象 - 没有未定义或对象

2017-01-28
3191

考虑代码

const arr = [];
[1].map(arr.push)

这给出了 TypeError: can't convert undefined to object (至少在 Firefox 上),但几乎同义的代码

const arr = [];
[1].map(v => arr.push(v))

运行正常。

正如托马斯·巴宾顿·麦考利 (Thomas Babington Macaulay) 在对伊拉斯谟作品的评论中所写,“什么......?”

1个回答

这是因为 arr.push 只是对未绑定到 arr 的通用函数的引用。

因此,当作为回调调用时,它不知道您要推送到哪个数组

var func = [].push;
func(123); // TypeError: can't convert undefined to object

这将起作用,但多个参数将传递给 push ,您可能不想要这样的结果

const arr = [];
[1, "a"].map(arr.push.bind(arr)); // [ 3, 6 ]
arr; /* [  1,  0, [1, "a"],
         "a",  1, [1, "a"]  ] */

因此只需使用您的 [1].map(v => arr.push(v))

Oriol
2017-01-28