Когда я пытаюсь использовать математическую мощь в уменьшении, она не работает должным образом и возвращает бесконечность
const array1 = [1,2,3,4];
const initialValue = 0;
const sumWithInitial = array1.reduce(
(a,b) => a + Math.pow(b, b + a),
0
);
console.info(sumWithInitial);
Но если в arr1 всего 1-3 числа, все работает как задумано
Потому что число такое большое? Я не уверен, что вы ожидаете. На последнем шаге Math.pow(b, b + a) имеет b = 4 и a = 531450`, значит, 4 возводится в степень 531454.
На последней итерации вы превысили емкость типа JavaScript число (который является двоичным значением с плавающей запятой двойной точности IEEE-754). Это не имеет ничего общего с reduce, просто Math.pow(4, 4 + 531450) (последнее значение, созданное вашим циклом reduce) превышает предел:
console.info(Math.pow(4, 4 + 531450));
Вы можете увидеть, когда pow сделает это, с помощью абстрактной операции Number::expontiate в спецификации (в тексте бесконечность обозначается +∞𝔽, отрицательная бесконечность -∞𝔽). Это просто попытка использовать 64-битное значение, чтобы попытаться представить действительно, действительно, действительно огромное число.
Если вам нужно иметь дело с такими величинами и вам нужны только целые значения, вы можете использовать BigInt , как указывает Келдан Чепмен .
Как объясняли другие, вы получаете бесконечность из-за превышения лимита. Но если вы хотите получить фактический результат, вы можете использовать операции BigInt:
const array1 = [1n, 2n, 3n, 4n];
const initialValue = 0n;
const sumWithInitial = array1.reduce(
(a, b) => a + b**(b + a),
initialValue
);
console.info(sumWithInitial.toString());
Хорошая мысль о BigInt, однако. Не знаю, почему я не назвал это.
Правильно, я неправильно прочитал существующие комментарии/сообщения. Исправлено здесь, чтобы избежать путаницы.
Запуск функции с [1,2,3] дает 531450. В четвертой итерации формула в вашей функции сокращения будет 531450 + 4^(531450 + 4). Полученное число просто слишком велико и, следовательно, является Infinity для JS.