检查this.length到函数中的含义是什么?

时间:2016-01-04 16:50:26

标签: javascript functional-programming this reduce

我正在关注Javascript Functional Programming的在线课程 在练习16中,它向您展示了如何实际减少,以帮助您了解如何使用它,但在这个实现中有一些我实际上没有得到的东西,我将展示代码:< / p>

&#13;
&#13;
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;
&#13;
&#13;

在检查this.length这实际意味着什么时,我不理解第一个if语句?

  

请注意,这与ES5中的reduce不同,后者返回一个值而不是一个数组,这仅用作学习目的的样本。

1 个答案:

答案 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上有一个不同的实现可用于填充旧版浏览器。