07/09/2018, 18:08

Null với Undefined trong JavaScript

Thoạt đầu null và undefined có thể giống nhau, nhưng chúng lại khác xa nhau. Bài viết này sẽ tìm hiểu những điểm khác biệt và giống nhau giữa null và undefined trong JavaScript. Null là gì? Có 2 đặc điểm của null bạn cần hiểu: null là empty hoặc không tồn tại giá trị. null phải được ...

Thoạt đầu null và undefined có thể giống nhau, nhưng chúng lại khác xa nhau. Bài viết này sẽ tìm hiểu những điểm khác biệt và giống nhau giữa null và undefined trong JavaScript.

Null là gì?
Có 2 đặc điểm của null bạn cần hiểu:

  • null là empty hoặc không tồn tại giá trị.
  • null phải được assign.

Dưới đây là một ví dụ. Chúng ta sẽ assign giá trị null cho biến a:

let a = null;
console.log(a);
// null

Undefined là gì?
Undefined thường có nghĩa là một biến được khai báo, nhưng không được định nghĩa.
Ví dụ như biến b sau đây:

let b;
console.log(b);
// undefined

Bạn cũng có thể assign một biến bằng undefined:

let c = undefined;
console.log(c);
// undefined

Khi tìm kiếm properties không tồn tại của một object, bạn sẽ nhận được undefined:

var d = {};
console.log(d.fake);
// undefined

Giống nhau giữa null và undefined
Trong JavaScript chỉ có 6 giá trị falsy. Cả null và undefined là 2 trong 6 giá trị falsy. Sau đây là các giá trị falsy:

  • false
  • 0 (zero)
  • "" (string rỗng)
  • null
  • undefined
  • NaN (Không phải Number)

Bất kỳ giá trị khác trong JavaScript được coi là đúng.
Cũng trong JavaScript, có 6 giá trị primitive (nguyên thủy). Cả null và undefined là giá trị primitive. Giá trị primitive gồm có:

  • Boolean
  • Null
  • Undefined
  • Number
  • String
  • Symbol

Tất cả giá trị khác trong JavaScript là objects (objects, functions. arrays,...)
Một điều thú vị, khi sử dụng typeof để kiểm tra null sẽ trả về object

let a = null;
let b;
console.log(typeof a);
// object
console.log(typeof b);
// undefined

Điều này được coi là lỗi trong JavaScript (https://stackoverflow.com/questions/18808226/why-is-typeof-null-object).

null !== undefined
Như chúng ta đã thấy cho đến giờ, null và undefined là khác nhau, nhưng lại có một số điểm tương đồng. Vì vậy, nó làm cho cảm giác rằng null không đúng bằng undefined.

Nhưng có một điều khiến bạn ngạc nhiên, null loosely equals (bằng lỏng lẻo) undefined:

null == undefined
// true

Trong JavaScript, double equals (==) kiểm tra loose equality (bằng lỏng lẻo) và thực hiện ép kiểu. Điều này có nghĩa là chúng ta so sánh 2 giá trị sau khi đã chuyển đổi chúng thành một kiểu chung.

Sự khác biệt thực tế
Điều gì là khác biệt thực tế giữa null và undefined ?
Xem xét đoạn code sau đây:

let logHi = (str = 'hi') => {
  console.log(str);
}

Đoạn code trên tạo một function logHi. Function yêu cần một tham số và set giá trị mặc định của tham số là hi nếu nó không được truyền vào. Đây là điều chúng ta sẽ thấy:

logHi();
// hi

Chúng ta cũng có thể truyền vào tham số để overwrite giá trị mặc định:

logHi('bye');
// bye

Với tham số mặc định, undefined sẽ sử dụng tham số mặc định, trong khi đó null không sử dụng.

logHi(undefined);
// hi
logHi(null);
// null

Tóm lại

  • null là một giá trị được gán. Nó nghĩa là không có gì.
  • undefined thường có nghĩa là một biến được khai báo nhưng chưa được định nghĩa.
  • null và undefined là các giá trị falysy.
  • null và undefined là các giá trị nguyên thủy. Tuy nhiên có một lỗi đó là typeof null = object
  • null !==undefined nhưng null == undefined
0