要学习reduce
功能,我已经对此w3schools example做过实验
<!DOCTYPE html>
<html>
<body>
<p>Click the button to get the sum of the rounded numbers in the array.</p>
<button onclick="myFunction()">Try it</button>
<p>Sum of numbers in array: <span id="demo"></span></p>
<script>
var numbers = [15.5, 2.3, 1.1, 4.7];
function getSum(total, num) {
return total + Math.round(num);
}
function myFunction(item) {
document.getElementById("demo").innerHTML = numbers.reduce(getSum, 0);
}
</script>
</body>
</html>
在此示例中,如果我们为initalValue
传递0,则返回24,但如果使用其默认值initalValue
,则结果为23.5!
所以我无法得到零点以及为什么它会改变结果! initialValue
是否已经等于0?
答案 0 :(得分:0)
否。 accumulator
的初始值是array
中的第一个元素,它从第二个元素开始直到明确地给accumulator
赋值(在这种情况下为0)。当没有给出值时,accumulator
开始时已经是15.5,但是当您给它赋予值0
时,它从那里开始,因此结果有所不同。
第一次调用回调时,累加器和currentValue 可以是两个值之一。如果在的调用中提供了initialValue reduce(),则累加器将等于initialValue,并且 currentValue将等于数组中的第一个值。如果不 提供initialValue,那么累加器将等于第一个 数组中的值,并且currentValue将等于第二个。
注意:如果未提供initialValue,则reduce()将执行 从索引1开始的回调函数,跳过第一个索引。如果 提供了initialValue,它将从索引0开始。
引用MDN
答案 1 :(得分:0)
如果未提供初始值,则数组中的第一个元素将 使用。在没有初始值的空数组上调用reduce() 是一个错误。
因此,如果您不使用0,则将15.5
作为初始值
您可以在此处阅读更多信息-> Reduce Parameters
例如,如果看到的话,您可以看到此代码,因为开始时我们有0.1,所以它将作为初始值。
let arr = [0.1,15.5, 2.3, 1.1, 4.7]
let output = arr.reduce((op, cur) => op+=Math.round(cur) )
console.log(output)
答案 2 :(得分:0)
如果初始值为0,则getSum返回的所有和均为整数,第一次计算为0 + Math.round(15.5)=16。另外,由于使用Math.round加法,它们都是整数。这就是为什么最终结果是整数(24)的原因。 如果未提供初始值,则由getSum计算的第一个和为15.5 + Math.round(2.3)= 17.5。进一步的计算都是使用第一个而非四舍五入的求和完成的,该求和不是整数,但小数部分为0.5。因此,最终结果不是整数。 可能有助于放置
console.log("add "+total+" + "+num+" => "+Math.round(num)+" = "+(total + Math.round(num)));
作为getSum函数的第一行,并查看控制台输出(在Firefox上为F12)。
答案 3 :(得分:0)
initialValue(可选)-用作首次调用回调的第一个参数的值。 1.如果未提供初始值,则将使用数组中的第一个元素。 2.在没有初始值的空数组上调用reduce()是错误的。 (请参阅mdn)
根据第一个语句,如果不使用初始值,则将使用第一个元素,因此在此数组[15.5,2.3,1.1,4.7]中,将第一个元素用作初始值,因为math.round()是不适用于初始值(15.5)。
A。因此,对于0,减少功能的输入为-0 + 16 + 2 + 1 +5 = 24 B.没有0的输入是-15.5 + 2 +1 + 5 = 23.5
因此,解释第一和第二条语句时,如果要对输入进行某些操作(例如Math等),则必须提供所需的初始值(在上述情况下为0)。