Assignment and Arithmetic

Tương tự C++, JS cũng có các toán tử gán cơ bản.

Ngoài ra còn có thêm toán tử toán tử lũy thừa: ** và toán tử gán lũy thừa: **= (tương tự Python).

Comparison

JS có thêm toán tử so sánh nghiêm ngặt ===: so sánh hai giá trị bằng nhau về giá trị và kiểu dữ liệu. Nếu một giá trị không thỏa mãn === thì nó cũng không thỏa mãn ==. Do vậy, dùng === an toàn hơn là dùng ==.

Ngoài ra, khác với so sánh nghiêm ngặt ===, toán tử == có thể tự ép kiểu ngầm định rồi mới thực hiện phép so sánh.

console.log("4" == 4) // true

Logical

Cũng tương tự C/C++, cũng gồm có các toán tử: &&, ||!.

Attention

Biểu thức sử dụng các toán tử này sẽ trả về giá trị dựa trên chân trị của toán hạng.

Xét ví dụ sau:

let result = "A" && "B" && "C"
console.log(result) // "C"

Toán tử && đọc từ trái sang phải, nếu đối tượng đầu tiên là truthy[^1] thì sẽ lấy giá trị của đối tượng tiếp theo. Cứ xét tiếp từ trái sang phải đến khi nào gặp chân trị falsy thì dừng lại và trả về. Hoặc khi xét đến đối tượng cuối cùng thì cũng dừng lại và trả về giá trị của đối tượng đó.

Ở ví dụ trên, do “A” và “B” không phải là falsy nên “C” sẽ là giá trị của result.

Toán tử || thì ngược lại, nếu là truthy thì lấy, falsy thì xét tiếp.

let result = undefined || "C" || null
console.log(result) // "C"

Summary

Tóm tắt lại như sau:

  • &&: Nếu là falsy thì dừng và trả ra kết quả, truthy thì xét tiếp.
  • ||: Nếu là truthy thì dừng và trả ra kết quả, falsy thì xét tiếp.

Hai toán tử trên không trả về kiểu boolean mà trả về giá trị của các đối tượng có bên trong biểu thức. Chỉ khi các đối tượng có bên trong biểu thức là kiểu boolean thì toán tử mới trả về giá trị boolean.

Ternary Operators

Toán tử ba ngôi, nếu biểu thức trước toán tử là truthy thì thực hiện biểu thức sau dấu ?, là falsy thì thực hiện biểu thức sau dấu :.

let bool = true
 
bool ? console.log("Hello World") : console.log("Goodbye World")

Nullish Coalescing

Nếu biểu thức trước toán tử là null hoặc undefined thì sẽ lấy giá trị của biểu thức phía sau toán tử.

let a = null
 
let number = a ?? 0
 
console.log(number) // 0

Relational

So sánh hai toán hạng và trả về true hoặc false dựa trên mối quan hệ giữa chúng.

  1. a instanceof b: kiểm tra xem đối tượng a có phải là instance của đối tượng b hay không.

    Ví dụ:

    function Car(make, model, year) {
      this.make = make
      this.model = model
      this.year = year
    }
    const auto = new Car("Honda", "Accord", 1998)
     
    console.log(auto instanceof Car)
    // Expected output: true
     
    console.log(auto instanceof Object)
    // Expected output: true
  2. p in o: kiểm tra xem thuộc tính p có tồn tại trong đối tượng o hay không.

    Ví dụ:

    const car = { make: "Honda", model: "Accord", year: 1998 }
     
    console.log("make" in car)
    // Expected output: true
     
    delete car.make
    if ("make" in car === false) {
      car.make = "Suzuki"
    }
     
    console.log(car.make)
    // Expected output: "Suzuki"

Zero-filling Right Shift

Toán tử này (hay còn gọi là toán tử unsigned right shift - >>>) giúp dịch bit sang phải và điền các số 0 vào các vị trí trống.

const a = 5 //  00000000000000000000000000000101
const b = 2 //  00000000000000000000000000000010
const c = -5 //  11111111111111111111111111111011
 
console.log(a >>> b) //  00000000000000000000000000000001
// Expected output: 1
 
console.log(c >>> b) //  00111111111111111111111111111110
// Expected output: 1073741822

sort file.ctime asc


## Resources

- [instanceof Operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof)
- [in Operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in)
- [Unsigned Right Shift](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Unsigned_right_shift)

[^1]: xem thêm [[JS Booleans]]