
Math.max를 함부로 쓰면 안되는 이유
const array = Array.from({length: 100000}, () => 0)
let max = Math.max(...array)
// run time error 발생
- 자바스크립트에서 Math.max() 함수는 배열을 인수로 받지 않고, 개별 숫자들을 쉼표로 구분된 인자(argument) 리스트로 받음
- 그렇기 때문에 배열에서의 최대값을 구하기 위해선 보통 스프레드 문법을 활용해 Math.max(...배열)을 통해 max값을 구하는 것이 일반적
예: array = [1, 5, 3] → Math.max(1, 5, 3) // 5
콜 스택(Call Stack)의 한계
- 함수가 호출될 때, 전달되는 인자들은 JavaScript 엔진의 메모리 영역인 콜 스택(Call Stack)에 저장
- 그러나 만약 array 배열의 길이가 매우 클 경우 (수십만 개 이상), 스프레드 문법은 너무 많은 숫자를 인자 리스트로 만들고, 이 인자들이 콜 스택의 허용 용량을 초과하게 됨
- 결론적으로, 큰 배열을 스프레드하는 것은 RangeError: Maximum call stack size exceeded (최대 호출 스택 크기 초과) 에러를 발생시키기게 되는 것
빈 배열일 때의 문제
- 만약 빈 배열에 스프레드 문법을 활용해 Math.max를 적용하면 -infinity가 나오는 문제가 있음
Math.max(...[]) // -infinity
해결책
- reduce()를 활용 또는 단순 for문 순회 활용
- reduce, for문을 통한 순회는 배열을 순회하며 계산하기 때문에, 콜 스택에 인자를 쌓지 않아 제한 문제에서 자유로움
JavaScript
// 기존 코드 (에러 유발 가능)
// let max = Math.max(...array)
// 수정된 코드 (안전한 최대값 찾기)
let max;
if (array.length === 0) {
max = 0; // 배열이 비어있는 경우를 대비
} else {
max = array.reduce((acc, current) => Math.max(acc, current), array[0]);
}
// for문 활용
let maxv = 0
for(let i=0; i< array.length; i++){
maxv = Math.max(maxv, array[i])
}