Math.max() nhận danh sách arguments rời rạc, không nhận mảng. Spread operator ... "bung" mảng thành arguments — giải pháp sạch đẹp.
Vấn đề với Math.max()
<script>
const arr = [1, 2, 3];
Math.max(arr); // NaN — không nhận array
Math.max(arr[0], arr[1], arr[2]); // 3 — nhưng phải viết tay từng phần tử
</script>
Giải pháp: Spread Operator
<script>
const arr = [1, 2, 3];
const max = Math.max(...arr); // 3 — spread bung mảng thành 1, 2, 3
document.write(max);
</script>
Kết quả
3
Tương tự: Math.min()
const min = Math.min(...arr); // 1
Lưu ý quan trọng
- Stack limit:
Math.max(...hugeArray)có thể gâyRangeError: Maximum call stack size exceedednếu mảng > ~100k-200k phần tử (tùy engine). - Giải pháp mảng lớn: Dùng
reducehoặc loop.
An toàn cho mảng mọi kích thước
function safeMax(arr) {
if (!arr.length) return undefined;
// Cách 1: reduce (O(n), không stack overflow)
return arr.reduce((max, val) => val > max ? val : max, arr[0]);
// Cách 2: loop (nhanh nhất)
// let max = arr[0];
// for (let i = 1; i < arr.length; i++) if (arr[i] > max) max = arr[i];
// return max;
}
So sánh hiệu suất
| Phương pháp | Mảng nhỏ (<10k) | Mảng lớn (>100k) | Đọc hiểu |
|---|---|---|---|
Math.max(...arr) | Nhanh, đẹp | Stack overflow | ⭐⭐⭐ |
arr.reduce(...) | Trung bình | An toàn | ⭐⭐ |
| for loop | Nhanh nhất | An toàn | ⭐ |
Math.max.apply(null, arr) | Trung bình | Stack overflow (cũ) | ⭐ |
Kết luận
Dùng Math.max(...arr) cho mảng vừa/vài nghìn phần tử. Mảng lớn hoặc performance critical → reduce hoặc for loop.