Docly

NaN là gì? Kiểu dữ liệu NaN trong JavaScriptNaN là gì?

NaN là gì? Có lẽ rằng trong khi lập trình nói chung và nhất là với Javascript nói riêng đã không ít lần chúng ta gặp trường hợp một biến của chúng ta trả về một kiểu dữ liệu không mấy đẹp đẽ lắm là NaN. Những người chưa hiểu sâu về nó thường nghĩ ngay đến đã có gì đó sai sai trong xử lý mà dẫn đến kiểu dữ liệu này, hay đây là một loại thông báo lỗi mới, hay là do ăn ở… Tất nhiên chúng ta không thể trả lời một vấn đề kĩ thuật bằng những lý do rất “thiểu năng” như thế được. Chính vì thế nên chúng ta mới ngồi đây cùng nhau tìm hiểu rõ hơn. Rốt cuộc thì NaN nó là gì, khi nào nó xuất hiện và chúng ta sẽ xử lý nó như thế nào. Cùng tìm hiểu qua bài viết sau của Trang tài liệu nhé!

NaN là gì nhỉ?

Đầu tiên, NaN không phải là một từ khóa trong JavaScript giống như true, false, null … mà nó là một thuộc tính của global object. Giá trị của NaN giống như giá trị của Number.NaN:

NaN; // NaN
Number.NaN; // NaN

Vậy chúng ta có thể thấy rằng NaN được xem như một kiểu Number. Lý do tại sao thì chúng ta sẽ cùng nhau thảo luận trong các phần tiếp theo của bài viết này. Để kiểm chứng điều đó chúng ta hoàn toàn có thể sử dụng từ khóa typeof. Cách đơn giản nhất là hãy bật ngay cửa sổ console của trình duyệt lên và thử gõ vào đoạn lệnh sau:

typeof NaN
'number'

OK, kết quả hiển thị cho thấy NaN được xem như một kiểu Number. Vậy NaN có thể xuất hiện trong các trường hợp nào. Hãy cùng nhau khám phá tiếp nhé

Các cách để phát sinh NaN

  • Lấy số 0 chia cho số 0
  • Lấy vô cùng (infinity) chia cho vô cùng (infinity)
  • Nhân vô cùng (infinity) với số 0
  • Bất kỳ phép tính toán nào trong đó NaN là một toán hạng
  • Chuyển đổi một xâu non-numeric hoặc undefined về dạng number

Tại sao kiểu dữ liệu của NaN là ‘number’?

Như định nghĩa, NaN là giá trị trả về từ một biểu thức mà kết quả là số không được xác định (undefined numerical). Tức là nó vẫn là kiểu dữ liệu numeric, tuy nhiên nó chưa xác định như một kiểu số thực. Chính vì thế nên trong JavaScript, ngoài việc trở thành một thành phần trong global object, nó còn là một thành phần của Number object. Ngoài ra NaN cũng đại diện cho bất kì số nào thuộc ngoài khoảng biểu diễn của miền giá trị cho phép theo chuẩn ECMAScript. Bây giờ chúng ta sẽ cùng nhau thảo luận một số vấn đề liên quan đến NaN nhé.

Sự giới hạn của số học máy tính

Chúng ta cùng xem xét biểu thức sau:

 (3.2317006071311 * 10e616) / (3.2317006071311 * 10e616); /