Khác nhau giữa toán tử nullish coalescing (??) và logical OR (||) trong JS

6XWfLID
PVrJTTF Chú ếch ngốc nghếch

Tao thấy mày hay dùng cái ?? với cái ||. Nó là gì thế mày?

tQskr10 Jos Hoàng Tiên

Nó là Nullish CoalescingLogical OR. Nếu không biết thì hãy xem chi tiết sau đây...

SPBt4pP

Khi học JS mình chắc chắn các bạn sẽ có câu hỏi làm thế nào để gán giá trị default nếu như giá trị mong muốn bị null hoặc undefined. Cách đây vài năm, tìm hiểu thì hẳn các bạn sẽ thấy người ta dùng toán tử logical OR (||) để làm điều đó, hoặc chuối hơn là dùng if/else phải không nào. Ví dụ dùng logical OR (||):

JavaScript
var defaultValue = 'Javascript Program';

function getProgramName() {
  var value;

  return value || defaultValue;
}

console.log(getProgramName()); // 'Javascript Program'
  

Hoặc cách cực kỳ chuối, check if/else:

JavaScript
var defaultValue = 'Javascript Program';

// ví dụ thôi nhá, đừng dùng cách này
function getProgramName() {
  var value;

  // nếu value không có gía trị thì lấy default
  if (value === null || value === undefined) {
    return defaultValue;
  }

  return value;
}

console.log(getProgramName()); // 'Javascript Program'
  

Còn ở thời nay, xịn xò hơn bạn đã có toán tử nullish coalescing (??). Ví dụ:

JavaScript
var defaultValue = 'Javascript Program';

function getProgramName() {
  var value;

  return value ?? defaultValue;
}

console.log(getProgramName()); // 'Javascript Program'
  

Vậy câu hỏi đặt ra, cả hai toán tử || và ?? như nhau vậy cần gì JS hỗ trợ thêm cái ?? làm chi.

Định nghĩa ??

Theo như MDN docs viết:

"The nullish coalescing operator (??) is a logical operator that returns its right-hand side operand when its left-hand side operand is null or undefined, and otherwise returns its left-hand side operand."

Nghĩa là toán tử sẽ trả về giá trị phía bên phải nếu giá trị phía bên trái là null hoặc undefined, ngược lại sẽ trả về phía bên trái.

Khác biệt ?? và ||

Về cơ bản ??|| mục đích như nhau, nhưng với || sẽ "thêm thắt" đôi chút.

Toán tử || sẽ trả về giá trị phía bên phải nếu giá trị phía bên trái là falsy, không chỉ có null/undefined như ??.

Về falsy chỉ cần nhớ, có 8 giá trị mà khi biên dịch JS sẽ cho đó là false:

  • false
  • undefined
  • null
  • NaN
  • 0
  • -0
  • 0n
  • '' (empty string)

Vì vậy khi dùng toán tử || nó sẽ trả về giá trị bên phải trong trường hợp vế trái rơi vào 8 trường hợp trên (toán tử ?? chỉ có 2 trường hợp). Ví dụ:

JavaScript
var defaultValue = 10;
var value = 0;

console.log(value || defaultValue); // in ra 10

console.log(value ?? defaultValue); // in ra 0

// ...các bạn ví dụ thêm với các giá trị trên sẽ thấy
  

Vì vậy JS hỗ trợ toán tử mới ?? để tránh những case này, làm cho code work theo ý muốn hơn.

Bonus

Bạn có thể sử dụng kết hợp toán tử optional chaining (?.) và nullish coalescing (??) cùng nhau. Ví dụ:

JavaScript
var defaultValue = 'Javascript Program';
var obj = {
  program: null
};

console.log(obj.program?.name ?? defaultValue); // 'Javascript Program'
  

Như vậy sẽ trông pro hơn hẳn.

Kết luận

Thực ra nếu bạn là C# developer bạn sẽ thấy ôi, C# cũng có ?? vậy không lẽ mấy bác Microsoft mượn idea? Không đâu, thực ra ngược lại mới đúng, JS mượn idea ?? từ C# đó.

Tóm lại:

  • ?? chỉ check 2 trường hợp duy nhất nullundefined
  • Còn || sẽ check falsy (8 trường hợp)
  • Sử dụng ?? sẽ tránh check nhiều điều kiện không mong đợi, tránh lỗi trên trời rơi xuống, recommend hơn.

1 Nhận xét

  1. Nặc danh

    Mình đã theo dõi bạn từ lâu, bài viết của bạn thật sự rất hay nhưng rất nhiều lỗ hổng, bạn có thể xem xét ý kiến và cải thiện bài viết của mình hơn

    Reply Delete lúc 03:53 22 tháng 7, 2023
Mới hơn Cũ hơn