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

NaN trong JavaScript là gì? Đặc điểm và cách xử lý

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 == NaN cũ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ánVí dụKết quả
Chia 0 cho 00 / 0NaN
Căn bậc 2 số âmMath.sqrt(-1)NaN
Vô cùng trừ vô cùngInfinity - InfinityNaN
Ép kiểu thất bạiNumber("abc"), parseInt("xyz")NaN
Phép toán với NaNNaN + 5, NaN * 10NaN
Modulo với 05 % 0NaN

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ặc Object.is(x, NaN).
  • Luôn validate input số trước khi tính toán.