NaN (Not a Number) là kết quả của một phép toán số không ra kết quả hợp lệ:
javascript
0 / 0 // NaN
Math.sqrt(-1) // NaN
Number('abc') // NaN
parseInt('abc') // NaN
undefined + 1 // NaNTheo chuẩn IEEE 754, NaN không bằng bất cứ giá trị nào — kể cả chính nó.
Đây là quy định của chuẩn số học dấu chấm động, không phải đặc thù JavaScript.
javascript
NaN === NaN // false
NaN == NaN // false
[NaN].includes(NaN) // true — includes dùng SameValueZero
[NaN].indexOf(NaN) // -1 — indexOf dùng ===
Object.is(NaN, NaN) // trueKiểm tra đúng cách:
javascript
Number.isNaN(value) // ĐÚNG — chỉ true khi value thật sự là NaN
isNaN(value) // SAI — ép kiểu trước rồi mới kiểm tra
isNaN('hello') // true ← 'hello' không phải NaN, chỉ là ép về NaN
Number.isNaN('hello') // false ← đúngLưu ý: typeof NaN trả về 'number'. NaN vẫn thuộc kiểu number, chỉ là một giá trị không hợp lệ trong kiểu đó.
Chốt: trong code thật, Number.isNaN() là cách kiểm tra duy nhất nên dùng; isNaN() toàn cục là API legacy và gần như luôn không đúng ý người viết.