Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Cách kiểm tra NaN (Not-a-Number) trong JavaScript

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-isnan yêu cầu dùng Number.isNaN.

Tóm tắt

Phương thứcĐộ chính xácKhuyến nghị
Number.isNaN()Cao (không ép kiểu)✅ Dùng luôn
x !== xCaoPolyfill cho môi trường cũ
isNaN() (global)Thấp (ép kiểu)❌ Tránh