为什么javascript中的reduce函数中添加了无穷大?

为什么javascript中的reduce函数中添加了无穷大?,javascript,functional-programming,Javascript,Functional Programming,在这个特定的代码中 function cakes(recipe, available) { return Object.keys(recipe).reduce(function(val, ingredient) { return Math.min(parseInt(available[ingredient] / recipe[ingredient] || 0), val) },Infinity); } 函数调用示例: cakes({ flour: 500, sugar: 200

在这个特定的代码中

function cakes(recipe, available) {
  return Object.keys(recipe).reduce(function(val, ingredient) {
    return Math.min(parseInt(available[ingredient] / recipe[ingredient] || 0), val)
  },Infinity);
}
函数调用示例:

cakes({ flour: 500, sugar: 200, eggs: 1 },{flour: 1000, sugar: 1200, eggs: 5, milk: 200 });
“它返回2


如果我在代码中删除
Infinity
,它将返回
NaN

它是reduce方法的初始值,如果用数字替换,它将是函数中的最大值

功能蛋糕(配方,可用){
返回对象。键(配方)。减少(函数(val,成分){
返回Math.min(parseInt(可用[配料]/配方[配料]| | 0),val)
},10000);
}
采用还原函数和起始值。在数学中,我们在做加法时通常使用
0
,例如
[]。reduce((v,a)=>v+a,0)/=>0
,而乘法使用1,例如
[]。reduce((v,a)=>v*a,1)/=>1

如果我使用不含任何成分的kake调用代码,它将返回初始累加器值:

const ingredients = { sand: 10000 };
const airCake = {};
cakes(airCake, ingredients); // ==> Infinity
因此,你可以做无限多的空气蛋糕。第二次你有一个蛋糕,你没有无限量的原料,你需要超过0,你会得到很多次,你可以做这个蛋糕,小于无限量,这是传递给下一个原料。结果是你所用成分最少的比例与它的用量之比

const sandCake = { sand: 100 };
cakes(sandCake, ingredients); // ==> 100
这返回100,因为你有足够的沙来容纳100,它小于无穷大

如果您不向
reduce
提供起始值,它将使用数组中的第一个值作为累加器,因此您将在第一次迭代时执行此操作:

Math.min(parseInt(available['sugar'] / recipe['sugar'] || 0), 'flour') // => NaN
Math.min
不知道如何用数字解释
floor
,它会立即变成
NaN
(不是数字)。进一步的迭代可以得到:

Math.min(5, Nan); // => NaN
如果JS数学函数中的任何值为
NaN
,则所有JS数学函数都将返回
NaN
。这是一种由monad进行的错误处理,在这种情况下,您可以让数学不失败,并且可以在完成时研究值超出范围的结果。下面是在JS中创建
NaN
Infinity
-Infinity
的示例:

 0 / 0; // => NaN
 1 / 0; // => Infinity
-1 / 0; // => -Infinity

如果要找到某个值的最大值,且该值可以低于零,那么Inifinty是一个非常好的累加器。

因此Math.min中的第一个比较成功。第二个参数是reduce的初始值