NaN (Not-a-Number) là giá trị đặc biệt kiểu number biểu thị kết quả phép toán số học không hợp lệ. Đặc thù: NaN !== NaN (duy nhất giá trị không tự bằng chính nó).
Cách kiểm tra chuẩn xác
1. Number.isNaN() (ES6 - Khuyến nghị)
Chỉ trả về true nếu tham số là kiểu number và giá trị NaN. Không ép kiểu.
Number.isNaN(NaN); // true
Number.isNaN("hello"); // false (không ép kiểu)
Number.isNaN(undefined); // false
Number.isNaN(0/0); // true
2. isNaN() (Global - Cũ, cẩn thận)
Ép kiểu tham số sang Number trước khi kiểm tra. Có thể cho kết quả sai bất ngờ.
isNaN(NaN); // true
isNaN("hello"); // true! (Number("hello") = NaN)
isNaN(undefined); // true! (Number(undefined) = NaN)
isNaN("123"); // false (Number("123") = 123)
isNaN({}); // true (Number({}) = NaN)
3. Tự kiểm tra: x !== x (Polyfill cũ)
Vì NaN !== NaN, ta dùng: value !== value chỉ true khi value là NaN.
function isNaNPolyfill(x) {
return x !== x; // Chỉ NaN thỏa mãn
}
Ví dụ demo
<button onclick="checkNaN()">Kiểm tra NaN</button>
<p id="result"></p>
<script>
function checkNaN() {
const tests = [
6234, -52.1, 'Website', NaN, '', 0, false, 0/0, parseInt('abc')
];
let html = "";
tests.forEach(val => {
const globalIsNaN = isNaN(val);
const numberIsNaN = Number.isNaN(val);
const selfCheck = val !== val;
html += `${String(val).padEnd(10)} | isNaN: ${globalIsNaN} | Number.isNaN: ${numberIsNaN} | x!==x: ${selfCheck}
`;
});
document.getElementById('result').innerHTML = html;
}
</script>
Khi nào gặp NaN?
- Phép toán số học vô nghĩa:
0/0,Math.sqrt(-1),Infinity - Infinity. - Ép kiểu thất bại:
parseInt("abc"),Number("xyz"),+"abc". - Phép toán với NaN:
NaN + 5→ NaN.
Best Practice
- Luôn dùng
Number.isNaN()– chính xác, không ép kiểu. - Khi nhận input từ user/form:
const num = Number(input); if (Number.isNaN(num)) { ... } - Kiểm tra trước khi tính toán:
if (Number.isNaN(a) || Number.isNaN(b)) return; - ESLint rule:
use-isnanyêu cầu dùngNumber.isNaN.
Tóm tắt
| Phương thức | Độ chính xác | Khuyến nghị |
|---|---|---|
Number.isNaN() | Cao (không ép kiểu) | ✅ Dùng luôn |
x !== x | Cao | Polyfill cho môi trường cũ |
isNaN() (global) | Thấp (ép kiểu) | ❌ Tránh |