NaN (Not-a-Number) là một giá trị đặc biệt kiểu number biểu thị kết quả của phép toán số học không xác định hoặc không thể biểu diễn. Dù tên gọi "Not a Number", nhưng typeof NaN === "number".
Đặc điểm quan trọng
typeof NaN === "number"– là kiểu number.NaN !== NaN– duy nhất giá trị trong JS không tự bằng chính nó.NaN == NaNcũng làfalse.- Mọi phép toán với NaN trả về NaN:
NaN + 1 = NaN,NaN * 0 = NaN. - Là giá trị falsy:
Boolean(NaN) === false.
Cú pháp truy cập
Number.NaN // Thuộc tính static của Number
NaN // Biến toàn cục (global property)
window.NaN // Trong browser
Các trường hợp tạo ra NaN
| Loại phép toán | Ví dụ | Kết quả |
|---|---|---|
| Chia 0 cho 0 | 0 / 0 | NaN |
| Căn bậc 2 số âm | Math.sqrt(-1) | NaN |
| Vô cùng trừ vô cùng | Infinity - Infinity | NaN |
| Ép kiểu thất bại | Number("abc"), parseInt("xyz") | NaN |
| Phép toán với NaN | NaN + 5, NaN * 10 | NaN |
| Modulo với 0 | 5 % 0 | NaN |
Cách kiểm tra NaN
// ✅ CHUẨN - Number.isNaN() (ES6)
Number.isNaN(NaN); // true
Number.isNaN("abc"); // false (không ép kiểu)
// ❌ CỨU - isNaN() global (ép kiểu)
isNaN(NaN); // true
isNaN("abc"); // true! (Number("abc") = NaN) - DỄ GÂY BUG
// 🔧 POLYFILL cho môi trường cũ
function isNaN_(x) { return x !== x; }
isNaN_(NaN); // true
isNaN_(123); // false
Ví dụ thực tế
<button onclick="demo()">Kiểm tra các giá trị</button>
<pre id="out"></pre>
<script>
function demo() {
const vals = [6234, -52.1, 'Hello', NaN, '', 0, false, 0/0, parseInt('abc')];
let out = "";
vals.forEach(v => {
out += `${String(v).padEnd(10)} → isNaN: ${isNaN(v)} | Number.isNaN: ${Number.isNaN(v)} | v!==v: ${v!==v}\n`;
});
document.getElementById('out').textContent = out;
}
</script>
Xử lý NaN an toàn
// 1. Kiểm tra trước khi tính
function safeDiv(a, b) {
if (Number.isNaN(a) || Number.isNaN(b) || b === 0) return NaN;
return a / b;
}
// 2. Fallback giá trị hợp lệ
const speed = Number(input.value) || 0; // Nếu NaN/0/"" → 0
// 3. Lọc NaN khỏi mảng
const clean = arr.filter(n => !Number.isNaN(n));
// 4. Object.is() so sánh NaN (ES6)
Object.is(NaN, NaN); // true - CÁCH DUY NHẤT SO SÁNH NAN = NAN
Tóm tắt
- NaN là số đặc biệt, typeof = "number".
- Không bao giờ dùng
x === NaN– luôn false. - Dùng
Number.isNaN(x)hoặcObject.is(x, NaN). - Luôn validate input số trước khi tính toán.