NaN (viết tắt của “Not-a-Number”) là một giá trị đặc biệt trong JavaScript, đại diện cho một giá trị không hợp lệ khi thực hiện các phép toán liên quan đến số học. Khi một biểu thức toán học hoặc thao tác không thể trả về một giá trị số hợp lệ, kết quả sẽ là NaN.
NaN là một phần của đặc tả JavaScript (ECMAScript) và thường được sử dụng khi các thao tác như phép tính toán học hoặc chuyển đổi dữ liệu không thể đưa ra một giá trị số thực tế. Mặc dù tên gọi là “Not-a-Number”, nhưng NaN thực chất là một giá trị thuộc kiểu dữ liệu Number
trong JavaScript.
Number
: Mặc dù nó có nghĩa là “không phải số”, NaN thuộc kiểu dữ liệu số.console.log(typeof NaN); // "number"
Trong JavaScript, bất kỳ phép toán nào không trả về một số hợp lệ sẽ cho kết quả là NaN. Ví dụ, phép chia số 0 cho 0 hoặc phép căn bậc hai của một số âm.
console.log(0 / 0); // NaN console.log(Math.sqrt(-1)); // NaN
false
.console.log(NaN === NaN); // false
Điều này dẫn đến việc kiểm tra xem một giá trị có phải là NaN không cần có các công cụ đặc biệt thay vì dùng phép so sánh thông thường.
Do NaN không thể so sánh trực tiếp bằng toán tử ===
, JavaScript cung cấp hai phương thức để kiểm tra liệu một giá trị có phải là NaN hay không.
isNaN()
: Hàm này kiểm tra xem một giá trị có phải là NaN hoặc có thể chuyển đổi thành NaN không. Tuy nhiên, nó có thể dẫn đến kết quả không mong muốn vì bất kỳ giá trị nào không phải số sẽ được chuyển đổi trước khi kiểm tra.console.log(isNaN(NaN)); // true console.log(isNaN(123)); // false console.log(isNaN('123abc')); // true (chuỗi không hợp lệ khi chuyển thành số)
Number.isNaN()
: Được giới thiệu trong ES6, Number.isNaN()
chỉ trả về true
nếu giá trị thực sự là NaN, và không thực hiện bất kỳ chuyển đổi kiểu dữ liệu nào trước đó. Đây là cách chính xác hơn để kiểm tra NaN.console.log(Number.isNaN(NaN)); // true console.log(Number.isNaN(123)); // false console.log(Number.isNaN('123abc')); // false
NaN xuất hiện trong các trường hợp sau:
console.log(0 / 0); // NaN console.log(Math.sqrt(-1)); // NaN console.log('abc' - 123); // NaN
console.log(Number('abc')); // NaN console.log(parseInt('12abc')); // 12 (phần chuỗi hợp lệ trước 'abc' sẽ được chuyển đổi) console.log(parseInt('abc')); // NaN (chuỗi không hợp lệ)
console.log(NaN + 5); // NaN console.log(NaN * 10); // NaN console.log(Math.max(5, NaN)); // NaN
Trong JavaScript, NaN có thể dễ dàng gây lỗi không mong muốn trong tính toán hoặc thao tác dữ liệu. Vì vậy, việc xử lý NaN cần được cân nhắc và áp dụng hợp lý. Bạn có thể dùng các kỹ thuật kiểm tra và thay thế NaN để tránh lỗi trong ứng dụng.
let result = 0 / 0; if (Number.isNaN(result)) { result = 0; // Đặt giá trị mặc định nếu kết quả là NaN } console.log(result); // 0
||
để đặt giá trị mặc định: Nếu phép toán có thể trả về NaN, bạn có thể đặt giá trị mặc định nếu kết quả là NaN.let value = NaN; let safeValue = value || 10; // Nếu value là NaN, dùng giá trị 10 console.log(safeValue); // 10
NaN trong JavaScript là một giá trị đại diện cho kết quả không hợp lệ của các phép toán số học hoặc chuyển đổi không hợp lệ từ dữ liệu không phải số. Mặc dù nó có nghĩa là “Not-a-Number”, nhưng NaN thuộc kiểu dữ liệu Number
. Để kiểm tra NaN, bạn nên sử dụng Number.isNaN()
để có kết quả chính xác hơn. NaN có thể xuất hiện từ các phép toán không hợp lệ, từ việc chuyển đổi dữ liệu không phải số, và lan truyền trong các phép tính, vì vậy cần cẩn thận khi thao tác với nó trong mã nguồn của bạn.