Sự khác biệt giữa một biến là: null, undefined hoặc undeclared là gì? Làm sao để bạn kiểm tra bất kỳ trạng thái nào trong số này?

{{FormatNumbertoThousand(model.total_like)}} lượt thích
230 lượt xem
Javascript senior

Các biến undeclared (chưa được khai báo) được tạo khi bạn gán một giá trị cho một identifier chưa được tạo trước đó bằng cách sử dụng var, let hoặc const. Các biến undeclared sẽ được xác định trên toàn bộ, bên ngoài của phạm vi hiện tại (current scope). Trong strict mode, một ReferenceError sẽ được thảy ra khi bạn cố gắng gán tới một biến undeclared. Các biến undeclared là không tốt như các biến toàn cục. Tránh chúng bằng mọi giá! Để kiểm tra chúng, hãy bọc chúng trong một khối try / catch.

function foo() {
   x = 1; // Throws a ReferenceError in strict mode
}

foo();
console.log(x); // 1

Một biến là undefined là một biến đã được khai báo, nhưng không được gán giá trị. Nó thuộc loại undefined. Nếu một hàm không trả về bất kỳ giá trị nào được gán cho một biến, thì biến đó cũng có giá trị undefined. Để kiểm tra nó, hãy so sánh bằng cách sử dụng toán tử Strict Equality (===) hoặc typeof. Lưu ý rằng bạn không nên sử dụng toán tử Abstract Equality (==) để kiểm tra, vì nó cũng sẽ trả về true nếu giá trị là null.

var foo;
console.log(foo); // undefined
console.log(foo === undefined); // true
console.log(typeof foo === 'undefined'); // true

console.log(foo == null); // true. Wrong, don't use this to check!

function bar() {}
var baz = bar();
console.log(baz); // undefined

Một biến là null nếu được gán cho một giá trị null. Nó đại diện cho không giá trị (no-value) và khác với undefined là nó đã được gán một cách rõ ràng. Để kiểm tra null, chỉ cần so sánh bằng cách sử dụng toán tử Strict Equality (===). Lưu ý rằng giống như ở trên, bạn không nên sử dụng toán tử Abstract equality (==) để kiểm tra, vì nó cũng sẽ trả về true nếu giá trị là undefined.

var foo = null;
console.log(foo === null); // true
console.log(typeof foo === 'object'); // true

console.log(foo == undefined); // true. Wrong, don't use this to check!

Theo thói quen cá nhân, tôi không bao giờ để các biến của mình là undeclared hoặc unassigned. Tôi sẽ gán null cho chúng một cách rõ ràng sau khi khai báo nếu tôi chưa có ý định sử dụng nó. Nếu bạn sử dụng linter (ví dụ ESLint) trong quy trình làm việc của mình, nó sẽ thường kiểm tra rằng bạn đang không tham chiếu tới các biến undeclared.

Câu hỏi tiếp theo: Temporal Dead Zone trong ES6 là gì?
{{login.error}}