Hiểu về null, undefined và NaN

Nếu bạn đang dấn thân vào JavaScript, một trong những thứ bạn cần học đầu tiên chính là các loại data. Như khi chúng ta nói về Numbers, Strings và Booleans khá rõ ràng, các object cũng ổn nhưng khi null và indentified nhập cuộc thì mọi thứ sẽ trở nên rối hơn một chút.

Nếu bạn muốn hiểu rõ các ví dụ dưới đây, hãy mở DevTools Console bằng cách nhấn Ctrl+Shift+J (Windows / Linux) or Cmd+Opt+J (Mac).

null

null value đại diện cho reference dẫn đến môt object hoặc address không tồn tại hoặc không có giá trị (source: MDN). Cho dù dẫn đến một thứ không tồn tại, bản thân nó lại là một global object (và là một trong những value đầu tiên của JavaScript).

Phủ nhận null sẽ return true , nhưng khi so sánh nó với false (hoặc cả true) thì đưa về false.

Theo công thức toán căn bản, null value chuyển về 0.

undefined

undefined property đại diện cho giá trị ban đầu undefined . Đây là một trong những type nguyên thủy của JavaScript (nguồn: MDN). Căn bản nó nói rằng một cái gì đó không xác định được. Bạn có thể xem ví dụ sau, hiển thị giá trị của một biến mà trước đó không được gán giá trị.

Khi bạn nêu biến nhưng không nêu giá trị cho nó, JavaScript sẽ gán giá trị “undefined” cho nó.

Nếu bạn thử theo phương pháp toán tin bằng undefined , bạn sẽ nhận về NaN . Tương tự như null, phủ nhận undefined sẽ trả về true, nhưng so nó với hoặc true hoặc false sẽ trả về false.

Vậy điểm khác biệt là gì? null vs undefined

Giống nhau:

  • Cả hai khi bị phủ nhận đều tra về true, nhưng không có cái nào bằng true hoặc false.
  • Chúng đều đại diện cho một cái gì đó không tồn tại…

Khác nhau:

  • null đại diện cho “nothing”, hoàn toàn không tồn tại, không xác định được thứ không được xác định.
  • undefined thì có dạng data của riêng nó (undefined), null thì chỉ là một object
  • null đưa về 0 khi vận hành bằng toán, undefined trả về NaN

Ngoài ra còn một vài thứ khác cần lưu ý.

Dòng đầu tiên: undefined == null, trả về true vì JavaScript cố gắng chuyển đổi cả hai giá trị về cùng loại.

Dòng thứ hai: undefined === null, cho chúng ta biết “Hãy so sánh với các loại data” (căn bản là check xem cả hai có giống nhau không) và JavaScript cũng đủ thông minh để thấy được sự khác biệt nên nó trả về “false”.

Và dòng cuối cùng: !undefined === !null, cái này thì đơn giản hơn. Vì cả hai giá trị bị phủ nhận đều trả về true, bạn có hai giá trị true, thì cuối cùng nó là true.

Nghe có vẻ hơi sai sai, và thật ra, đó là cái hay của ngôn ngữ này.

NaN (Not a Number)

Sau ki đã hiểu null và unidentified là gì, và sự khác nhau của chúng, chúng ta sẽ nói về giá trị NaN.

Property NaN có nghĩa là Not-A-Number (nguồn: MDN).

Tôi nghĩ định nghĩa này cũng đủ dễ hiểu. JavaScript return giá trị này khi cái chúng ta nhận được không phải số. Ví dụ, bạn muốn lấy giá trị “cucumber” trừ 10 hoặc lấy “R2D2” chia cho 12 vậy.

Dưới đây là một số trường hợp bạn nghĩ sẽ nhận dược giá trị này nhưng thật ra thì không:

  • Khi bạn add cái gì đó vào string. Khi JavaScript thấy và sign vào một string, nó cũng tự động chuyển đổi element thứ hai của cả string được add.

  • Khi bạn làm việc với number và boolean. Boolean được chuyển thành 0 và 1. True = 1. False = 0.

true * false giống như 1 * 0 bằng 0

Bây giờ mới là phần hack não. NaN thật ra là một số.

Vậy là, nó đại diện cho cái nó thiếu. Nói cho thông minh là nó là cái đối nghịch của chính nó.

Vậy nếu như NaN tự so và trả về false, vậy thì ta có so nó với cái gì đi nữa cũng sẽ trả về false. May thay là chúng ta có một function để check xem nó có phải NaN hay không — isNaN().

let là một variable block scoped.

Tóm gọm nhanh

Giá trị null đại diện cho nothing, một object hoặc address không tồn tại hoặc không có giá trị. Nó chuyển đổi từ 0 trong phương pháp vận hành toán đơn giản và là một global object.
null == false cho chúng ta false.

Property global undefined đại diện cho gá trị ban đầu undefined . Nó cho biết một cái không được gán giá trị; không được xác định. undefined không chuyển đổi bất cứ gì thành số, nên khi dùng nó dùng tính toán số học sẽ trả về NaN .

NaN (Not-A-Number) đại diện một cái không phải là số, mặc dù bản thân nó thật ra là một số. Nó không bằng chính nó và để check xem có NaN không chúng ta sẽ dùng isNaN() function.

Tất cả những cái trên đều là các giá trị mang tính false nên nó sẽ trả về false.

JavaScript rất giỏi chuyển đổi giá trị vì thế bạn cần phải dùng dấu bằng đến 3 lần (===) để đảm bảo cả hai elements không giống nhau.

Nguồn : TopDev via codeburst.io