在 JavaScript 中使用高阶函数中的原型函数

2024-01-05

我正在尝试使用reduce 连接数组数组,我想我可以使用 Array.prototype.concat 函数,如下所示:

arr = [[1],[2],[3]]
arr.reduce((a, b) => Array.prototype.concat(a, b), [])

效果很好并给了我数组[1, 2, 3]。然后我想我可以更聪明,这样做:

arr = [[1],[2],[3]]
arr.reduce(Array.prototype.concat, [])

然而,这给了我一个错误:

TypeError: Array.prototype.concat called on null or undefined
    at Array.reduce (native)
    at Object.<anonymous> (/home/axel/Developer/temp/reduce2.js:2:5)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)

似乎认为Array.prototype.concat is undefined。为什么是这样?


concat作为与某个对象相关的方法(即this方法执行的值)。当你将一个函数传递给另一个函数时,你不会传递任何this价值。因此,您实际上正在做类似的事情:

var rawConcat = Array.prototype.concat;
rawConcat(a,b);

您可以使用bind创建具有特定功能的函数的副本this烧入其中:

arr.reduce(Array.prototype.concat.bind(Array.prototype), [])

然而,现在问题已经解决了,还有其他几个问题阻止您这样做。

其一,reduce实际上得到four参数,包括当前索引和整个数组。你可以通过让你的(a,b)=>lambda 只将这四个参数中的两个传递给concat。这很好,但是当你直接提供一个函数作为参数时reduce,它将使用所有四个参数,因此您将获得调用的结果Array.prototype.concat(a, b, currentIndex, arr).

此外,您所做的并不是合理使用Array.prototype. The concat函数连接其参数并将它们附加到this价值。自从Array.prototype本身只是一个空数组(尽管有许多其他数组用作继承属性的自有属性),这实际上与[].concat(a,b)或者(也许更易读)a.concat(b).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JavaScript 中使用高阶函数中的原型函数 的相关文章

随机推荐