Toán tử Nullish Coalescing (??) trong TypeScript được giới thiệu để xử lý các giá trị nullundefined một cách an toàn và rõ ràng. Toán tử này giúp cung cấp một giá trị mặc định trong trường hợp biến có giá trị là null hoặc undefined, đồng thời cho phép giữ nguyên các giá trị khác (ví dụ: 0, false, "", v.v.), vốn có thể bị coi là “falsy” trong một số ngữ cảnh.

1. Định Nghĩa Toán Tử Nullish Coalescing

Toán tử Nullish Coalescing có cú pháp là ??. Nó hoạt động tương tự như toán tử OR (||), nhưng chỉ kiểm tra hai trường hợp cụ thể là nullundefined. Điều này có nghĩa là nếu biểu thức bên trái của toán tử là null hoặc undefined, thì giá trị mặc định (biểu thức bên phải) sẽ được trả về. Nếu không, giá trị bên trái sẽ được giữ nguyên.

Cú pháp:

const result = value ?? defaultValue;
  • Nếu valuenull hoặc undefined, defaultValue sẽ được trả về.
  • Nếu value không phải là null hay undefined (bao gồm cả 0, false, "",…), value sẽ được giữ nguyên.

2. Tại Sao Nên Sử Dụng Nullish Coalescing?

2.1. Tránh Nhầm Lẫn Với Giá Trị “Falsy”

Trong JavaScript và TypeScript, các giá trị như 0, false, NaN, "" (chuỗi rỗng) đều được coi là “falsy” khi sử dụng với toán tử OR (||). Điều này có thể dẫn đến các tình huống không mong muốn khi các giá trị hợp lệ như 0 hoặc false bị thay thế bằng giá trị mặc định.

Toán tử Nullish Coalescing giúp bạn giải quyết vấn đề này, bằng cách chỉ kiểm tra nullundefined.

Ví dụ với toán tử OR (||):

const value = 0;
const result = value || 42;
console.log(result); // Kết quả: 42

Trong ví dụ trên, giá trị 0 bị coi là “falsy”, nên kết quả trả về là 42, mặc dù 0 là một giá trị hợp lệ.

Ví dụ với toán tử Nullish Coalescing (??):

const value = 0;
const result = value ?? 42;
console.log(result); // Kết quả: 0

Với toán tử ??, giá trị 0 được giữ nguyên vì nó không phải là null hoặc undefined.

2.2. Xử Lý An Toàn Các Giá Trị nullundefined

Nullish Coalescing được thiết kế đặc biệt để xử lý các giá trị nullundefined một cách hiệu quả, giúp bạn tránh lỗi khi làm việc với các biến chưa được khởi tạo hoặc nhận giá trị từ các nguồn không xác định.

Ví dụ:

function getUserName(user?: { name?: string }): string {
    return user?.name ?? "Guest";
}

console.log(getUserName()); // Kết quả: Guest
console.log(getUserName({})); // Kết quả: Guest
console.log(getUserName({ name: "Alice" })); // Kết quả: Alice

Trong ví dụ này, nếu thuộc tính name của userundefined hoặc nếu user không tồn tại, hàm sẽ trả về "Guest". Điều này giúp đảm bảo rằng hàm luôn trả về một giá trị hợp lệ.

3. Sử Dụng Nullish Coalescing Kết Hợp Với Optional Chaining

Nullish Coalescing thường được sử dụng kết hợp với Optional Chaining (?.) để xử lý các đối tượng hoặc thuộc tính có thể không tồn tại. Optional Chaining giúp bạn tránh lỗi khi truy cập các thuộc tính của đối tượng có thể là null hoặc undefined, còn Nullish Coalescing cung cấp giá trị mặc định nếu kết quả là null hoặc undefined.

Ví dụ kết hợp:

const user = {
    name: "Alice",
    age: 30
};

const displayName = user?.name ?? "Anonymous";
console.log(displayName); // Kết quả: Alice

const userWithoutName = {
    age: 25
};

const displayName2 = userWithoutName?.name ?? "Anonymous";
console.log(displayName2); // Kết quả: Anonymous

Trong ví dụ trên, nếu thuộc tính name không tồn tại trong đối tượng user, giá trị "Anonymous" sẽ được sử dụng thay thế.

4. Kết Luận

Toán tử Nullish Coalescing (??) trong TypeScript là một công cụ hữu ích để xử lý các giá trị nullundefined một cách an toàn và chính xác. Nó cho phép bạn cung cấp giá trị mặc định trong các trường hợp cần thiết, mà không làm ảnh hưởng đến các giá trị hợp lệ khác như 0, false, hoặc "". Khi được kết hợp với Optional Chaining, Nullish Coalescing giúp tạo ra mã dễ đọc và ít lỗi hơn khi xử lý các đối tượng phức tạp.