我正在关注Javascript Functional Programming的在线课程 在练习16中,它向您展示了如何实际减少,以帮助您了解如何使用它,但在这个实现中有一些我实际上没有得到的东西,我将展示代码:< / p>
Array.prototype.reduce = function(combiner, initialValue) {
var counter, accumulatedValue;
// If the array is empty, do nothing
if (this.length === 0) {
return this;
}
else {
// If the user didn't pass an initial value, use the first item.
if (arguments.length === 1) {
counter = 1;
accumulatedValue = this[0];
}
else if (arguments.length >= 2) {
counter = 0;
accumulatedValue = initialValue;
}
else {
throw "Invalid arguments.";
}
// Loop through the array, feeding the current value and the result of
// the previous computation back into the combiner function until
// we've exhausted the entire array and are left with only one value.
while(counter < this.length) {
accumulatedValue = combiner(accumulatedValue, this[counter])
counter++;
}
return [accumulatedValue];
}
};
&#13;
在检查this.length
这实际意味着什么时,我不理解第一个if语句?
请注意,这与ES5中的reduce不同,后者返回一个值而不是一个数组,这仅用作学习目的的样本。
答案 0 :(得分:3)
Array.prototype.reduce = function(...
说,“在Array的原型上创建一个函数” - 这意味着新的reduce
函数可以在所有数组上调用,例如:
[1, 2, 3].reduce(...
这意味着你也可以在空数组上调用它,例如:
[].reduce(...
以评论为基础:
如果数组为空,则不执行任何操作
你正在处理一个数组,当调用该函数时,this
被设置为调用reduce
的数组。 reduce
的这种实现假设如果该数组为空(即this.length === 0
),则无法进一步在逻辑上减少它 - 没有什么可以减少的,所以你可以返回相同的空数组。
正如@Alnitak在评论中指出的那样,与the specification相比,reduce
的实施存在缺陷。 the MDN上有一个不同的实现可用于填充旧版浏览器。