- vừa được xem lúc

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

0 0 11

Người đăng: Thang Le

Theo Viblo Asia

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 (||):

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

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ụ:

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ử ||?? 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ụ:

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ụ

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.

Tóm lại

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.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Blog#173: Introduction to Advanced JavaScript Concepts - Advanced JavaScript Part 1

Hi, I'm Tuan, a Full-stack Web Developer from Tokyo . JavaScript is an essential language for web development, and learning advanced concepts can significantly improve your programming skills.

0 0 11

- vừa được xem lúc

Blog#174: 🤔Understanding Asynchronous JavaScript: 🔄Callbacks, 🤞Promises, and 🤝Async/Await

Hi, I'm Tuan, a Full-stack Web Developer from Tokyo . 1. Introduction to Asynchronous JavaScript. What is Asynchronous JavaScript.

0 0 13

- vừa được xem lúc

Blog#175: 🧐Mastering JavaScript's Execution Context and Closures🚀

Hi, I'm Tuan, a Full-stack Web Developer from Tokyo . 1. Understanding Execution Context. A Quick Overview.

0 0 10

- vừa được xem lúc

Blog#177: 🤔MAYBE YOU DON'T KNOW - 👌Using Node-Postgres in Node.js Express✨

Hi, I'm Tuan, a Full-stack Web Developer from Tokyo . In this article, we'll walk you through a step-by-step guide on using node-postgres with Node.

0 0 13

- vừa được xem lúc

Blog#176: 💪The Power of JavaScript Functional Programming🚀

. The main goal of this article is to help you improve your English level. I will use Simple English to introduce to you the concepts related to software development.

0 0 13

- vừa được xem lúc

[Javascript] Nâng cấp kỹ thuật tạo Tham số trong Hàm JS

1. Khái niệm.

0 0 14