This post hasn't been updated for 5 years

Khi làm quen với Javascript, mình đã tự hỏi tại sao lại có 2 giá trị đều mang nghĩa là "không có gì cả", đó là nullundefined. Đây là một trong những điểm dễ gây nhầm lẫn, nullundefined, hai khái niệm này không thể đồng nhất làm một dù cho ý nghĩa thực tế của chúng lại tương đối giống nhau. Vậy sự khác biệt giữa nullundefined là gì?

1. Undefined

Undefined có nghĩa là không xác định. Trong javascript, khi bạn khai báo một biến nhưng chưa gán giá trị cho nó, giá trị của biến đó sẽ là undefined.

var test; alert(test); //undefined

Bất cứ biến nào cũng có thể bị làm rỗng bằng cách thiết lập giá trị về không xác định (undefined).

var test = undefined; alert(test) //undefined

2. Null

Null có nghĩa là giá trị rỗng hoặc giá trị không tồn tại, nó có thể được sử dụng để gán cho một biến như là một đại diện không có giá trị.

var test = null; alert(test); //null

3. Sự khác biệt giữa null và undefined

typeof undefined // undefined typeof null // object

Có thể thấy undefind có kiểu giá trị là undefined nhưng null lại là 1 object (bạn có thể coi đó là một lỗi nhỏ trong JavaScript khi để kiểu của null là đối tượng, đáng ra kiểu của nó nên là null).

null === undefined // false null == undefined // true

Ngoài lề một chút:

  • Phép so sánh === (!==) Trên thực tế, phép toán so sánh === tuân theo quy luật dưới đây:
  • Nếu x và y khác kiểu nhau, false
  • Nếu như cả 2 vế đều là null hoặc undefined (null === null), true (tuy nhiên điều này không đúng với NaN đâu nhé)
  • Nếu cả 2 vế đều là kiểu Number, 1 trong 2 vế, hoặc cả 2 vế là NaN, false. Còn không thì so sánh giá trị
  • Nếu cả 2 vế đều là kiểu String, nội dung giống nhau: true, còn lại false
  • Nếu cả 2 vế đều là kiểu Boolean, giống nhau thì là true, khác nhau là false
  • Nếu cả 2 vế đều là kiểu Object tham chiếu, nếu cùng tham chiếu tới 1 object: true, còn lại là false
  • Nếu cả 2 vế đều là null, hoặc undefined, true
  • Nếu một vế là giá trị kiểu Number, vế còn lại là giá trị kiểu String, String sẽ được convert sang kiểu Number và so sánh giá trị
  • Nếu một vế là kiểu Boolean, một vế là kiểu Number, Boolean sẽ được chuyển sang kiểu Number và so sánh giá trị
  • Nếu một vế là kiểu Boolean, một vế là kiểu String, cả 2 vế sẽ được chuyển về kiểu Number và so sánh giá trị
  • Nếu một vế là kiểu Number, một vế là kiểu Object tham chiếu, vế Object tham chiếu sẽ được chuyển sang Number và so sánh giá trị
  • Nếu một vế là kiểu String, một vế là kiểu Object tham chiếu, vế Object tham chiếu sẽ được chuyển sang kiểu String và so sánh nội dung
  • Ngoài những trường hợp trên, tất cả đều là false Vậy nếu so sánh với toán tử == thì null và undefined bằng nhau nhưng với toán tử === thì chúng không bằng nhau. Javascript đã tự động ép kiểu trong phép so sánh null == undefined, để loại bỏ rủi ro có thể xảy ra này, chúng ta nên sử dụng === thay cho == và !== thay cho != trong các phép so sánh.

4. Tổng kết.

Hy vọng bài viết có thể phần nào giải thích được sự khác nhau giữa null và undefined trong javascript. Rất mong nhận được sự đóng góp ý kiến của các bạn để bài viết hoàn thiện hơn. Link tài liệu tham khảo: http://www.neilstuff.com/winhttp.html#null-vs-undefined https://mytechnetknowhows.wordpress.com/2016/05/27/some-java-script-nuances-null-undefined-nan/


All Rights Reserved