NaN trong JavaScript là gì?

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.

Tính chất của NaN

  • NaN thuộc kiểu 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
  • NaN không bằng chính nó: Một đặc điểm kỳ lạ của NaN trong JavaScript là nó không bao giờ bằng chính nó. Điều này nghĩa là, nếu bạn so sánh NaN với NaN, kết quả luôn luôn là 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.

Kiểm tra NaN bằng isNaN() và Number.isNaN()

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

Khi nào NaN xuất hiện?

NaN xuất hiện trong các trường hợp sau:

  1. Kết quả phép toán không hợp lệ: Nếu một phép toán không thể đưa ra kết quả hợp lệ, nó sẽ trả về NaN.
console.log(0 / 0);              // NaN
console.log(Math.sqrt(-1));       // NaN
console.log('abc' - 123);         // NaN
  1. Chuyển đổi chuỗi không hợp lệ thành số: Khi bạn cố gắng chuyển đổi một chuỗi không phải là một số hợp lệ thành kiểu số, kết quả sẽ là 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ệ)
  1. Các phép toán với NaN: Khi NaN xuất hiện trong một phép toán, toàn bộ kết quả của phép toán đó sẽ là NaN. NaN “lan truyền” trong biểu thức toán học.
console.log(NaN + 5);  // NaN
console.log(NaN * 10); // NaN
console.log(Math.max(5, NaN)); // NaN

Cách xử lý 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.

  1. Kiểm tra và xử lý NaN: Trước khi thực hiện tính toán, kiểm tra xem giá trị có phải là NaN hay không và xử lý giá trị đó một cách thích hợp.
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
  1. Sử dụng toán tử || để đặ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

Kết luận

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.