只是想知道,为什么 initialValue 被赋予函数式编程方法,比如reduce()?这样做的具体原因是什么?
不是将它放在函数的底部,也可以将它作为数组的第一个元素,因为它的行为相同,意思相同。 现在尝试学习函数式编程,但这一点没有意义。
答案 0 :(得分:3)
也可以将它作为数组的第一个元素,因为它的行为相同,意思相同。
嗯,不。 reduce
是一个泛型函数,可以使用任意数组,而不仅仅是那些具有我们期望值作为数组第一个元素的数组。最重要的情况是这里的空数组。
是的,可以将(unshift
)初始值作为数组的第一个元素推送,然后在没有初始值的情况下调用reduce
,然后再从数组中删除它并且你& #39; d有相同的结果。但这很麻烦,并且可能并不总是有效(例如使用不可变数组)。累加器甚至可能与数组元素的类型不同。
想想reduce
的实现,以及它应该是抽象的模式:
function reduce(callback, iterable) {
let val = ???;
for (const element of iterable)
val = callback(val, element);
return val;
}
将???
作为参数是明智的选择。
答案 1 :(得分:1)
这样做的主要原因是需要正确处理零长度数据结构。
对于乘法,好的选择是1,对于加法,它是0.对于某些数据类型,它是空字符串,单位矩阵等等。这些是具有二进制运算的algebraic structures的零(或单位)。
通过这种安排,可以减少例外情况。类比,为什么我们需要使用有符号整数?它就在那里,所以我们可以更自然地表达减法,在5 - 7
运算发生时没有例外。
大多数函数式编程都深深扎根于数学(代数)结构。对这些知识的了解确实有助于并简化查找美观和通用的解决方案。
此问题和答案也许有趣:Difference between fold and reduce?。
答案 2 :(得分:0)
如果数组为空并且未提供initialValue,则抛出TypeError。