Các giá trị undefined và null

Nhiều ngôn ngữ lập trình có các giá trị “không có” (hay non-value) gọi là null. Nó chỉ rằng một biến hiện tại chưa chứa tham chiếu tới tối tượng nào cả.

Trong JavaScript có tới hai giá trị kiểu như vậy, đó là: undefined null.

undefinednull

Cả hai giá trị rất giống nhau và hay được dùng lẫn với nhau. Tuy nhiên chúng có một chút điểm khác biệt. Bản thân ngôn ngữ JavaScript phân biệt chúng như sau:

  • undefined có nghĩa là một biến chưa có thông tin gì cả, nói cách khác nó chưa lưu giá trị cơ sở nào (sự thiếu vắng giá trị cơ sở).
  • null ám chỉ biến chưa tham chiếu tới đối tượng nào cả (sự thiếu vắng đối tượng).

Những tình huống xuất hiện undefinednull

Những tình huống xuất hiện undefined

Biến chưa được khởi tạo:

let myVar;
assert.equal(myVar, undefined);

Tham số không được truyền giá trị:

function func(x) {
  return x;
}
assert.equal(func(), undefined);

Truy cập một thuộc tính không tồn tại:

const obj = {};
assert.equal(obj.unknownProp, undefined);

Là kết quả trả về khi gọi một hàm không trả về giá trị:

function func() {}
assert.equal(func(), undefined);

Sự xuất hiện của null

Nguyên mẫu (hay prototype) của một đối tượng là một đối tượng khác hoặc null (tức không có nguyên mẫu);

Object.prototype không có nguyên mẫu:

> Object.getPrototypeOf(Object.prototype)
null

Khi bạn kiểm tra xem một biểu thức chính quy (regular expression), chẳng hạn /a/ có phù hợp với một chuỗi, chẳng hạn 'x' bạn nhận được một đối tượng có chứa thông tin phù hợp hoặc null (nếu không phù hợp):

> /a/.exec('x')
null

Kiểm tra undefinednull

Kiểm tra là một trong hai:

if (x === null) ...
if (x === undefined) ...

Kiểm tra xem biến x có chứa thông tin không (không phải undefined và không phải null):

if (x !== undefined && x !== null) {
  // ...
}

Ngược lại là kiểm tra x không chứa thông tin:

if (x === undefined || x === null) {
  // ...
}

undefinednull không có thuộc tính

undefinednull là hai giá trị duy nhất trong JavaScript gây ra lỗi khi bạn cố gắng đọc thuộc tính của chúng:

> function getFoo(x) {
  return x.foo;
}

> getFoo(undefined)
TypeError: Cannot get property 'foo' of undefined
> getFoo(null)
TypeError: Cannot read property 'foo' of null

> getFoo(true)
undefined
> getFoo({})
undefined

Lịch sử của undefinednull

Trong Java (truyền rất nhiều cảm hứng cho JavaScript), giá trị mặc định phụ thuộc vào kiểu của biến:

  • Các biến có kiểu đối tượng có giá trị mặc định là null.
  • Mỗi biến có kiểu cơ sở có giá trị mặc định riêng. Ví dụ, biến kiểu int có giá tri mặc định là 0.

Trong JavaScript, biến có thể mang giá trị của bất cứ kiểu dữ liệu nào, cả đối tượng lẫn kiểu cơ sở. Theo đó null có nghĩa là không mang đối tượng, undefined có nghĩa là không mang giá trị cơ sở.