# TypeScript - Operators

Xin chào, các nhà lập trình tương lai! Hôm nay, chúng ta sẽ bắt đầu một chuyến hành trình thú vị vào thế giới của các toán tử TypeScript. Như một người giáo viên máy tính gần gũi, tôi ở đây để hướng dẫn bạn từng bước trong cuộc phiêu lưu này. Vậy, hãy thắt dây an toàn và cùng nhau lặn sâu vào!

## 什么是运算符?

Trước khi bắt đầu cuộc hành trình tìm hiểu toán tử TypeScript, hãy hiểu xem toán tử thực sự là gì. Hãy nghĩ về các toán tử như những ký hiệu đặc biệt chỉ thị máy tính thực hiện các thao tác toán học hoặc logic cụ thể. Chúng giống như những cây c魔法 trong lập trình, chuyển đổi và kết hợp dữ liệu của chúng ta theo nhiều cách khác nhau.

Ví dụ, khi bạn thấy dấu "+" trong mã của mình, nó không chỉ là một phụ kiện sang trọng. Đó là một toán tử báo cho máy tính biết để cộng các thứ lại với nhau. Đúng là rất thú vị phải không?

## Toán tử số học

Hãy bắt đầu với các toán tử số học. Đây có lẽ là những toán tử quen thuộc nhất với bạn, vì chúng tương tự như những gì bạn đã sử dụng trong lớp toán.

Dưới đây là bảng các toán tử số học trong TypeScript:

| Toán tử | Mô tả | Ví dụ |
|---------|-------|-------|
| +       | Cộng  | 5 + 3 |
| -       | Trừ   | 7 - 2 |
| *       | Nhân  | 4 * 6 |
| /       | Chia  | 8 / 2 |
| %       | Modulus (dư) | 9 % 4 |
| ++      | Tăng  | let x = 5; x++; |
| --      | Giảm  | let y = 3; y--; |

Hãy xem chúng trong hành động:

```typescript
let a: number = 10;
let b: number = 5;

console.log(a + b);  // Output: 15
console.log(a - b);  // Output: 5
console.log(a * b);  // Output: 50
console.log(a / b);  // Output: 2
console.log(a % b);  // Output: 0

let c: number = 7;
c++;
console.log(c);  // Output: 8

let d: number = 3;
d--;
console.log(d);  // Output: 2

Trong ví dụ này, chúng ta đang thực hiện các thao tác số học khác nhau trên các biến của mình. Toán tử modulus (%) có thể mới đối với một số bạn. Nó cung cấp cho chúng ta dư số sau khi chia. Vì vậy, 10 % 5 là 0 vì 10 chia cho 5 không để lại dư số.

TypeScript - Operators

Toán tử quan hệ

Tiếp theo, chúng ta có các toán tử quan hệ. Chúng được sử dụng để so sánh các giá trị và trả về true hoặc false dựa trên so sánh.

Dưới đây là bảng các toán tử quan hệ:

Toán tử Mô tả Ví dụ
== Bằng 5 == 5
!= Không bằng 5 != 3
> Lớn hơn 7 > 3
< Nhỏ hơn 2 < 8
>= Lớn hơn hoặc bằng 5 >= 5
<= Nhỏ hơn hoặc bằng 4 <= 4

Hãy xem chúng hoạt động như thế nào:

let x: number = 5;
let y: number = 10;

console.log(x == y);  // Output: false
console.log(x != y);  // Output: true
console.log(x > y);   // Output: false
console.log(x < y);   // Output: true
console.log(x >= 5);  // Output: true
console.log(y <= 10); // Output: true

Các toán tử này rất hữu ích khi bạn cần đưa ra quyết định trong mã của mình dựa trên việc so sánh các giá trị.

Toán tử logic

Toán tử logic được sử dụng để xác định logic giữa các biến hoặc giá trị. Chúng giống như Sherlock Holmes của lập trình, giúp chúng ta suy luận sự thật từ nhiều điều kiện.

Dưới đây là bảng các toán tử logic:

Toán tử Mô tả Ví dụ
&& Logic AND true && false
|| Logic OR true || false
! Logic NOT !true

Hãy xem chúng trong hành động:

let isRaining: boolean = true;
let isWarm: boolean = false;

console.log(isRaining && isWarm);  // Output: false
console.log(isRaining || isWarm);  // Output: true
console.log(!isRaining);           // Output: false

Trong ví dụ này, && chỉ trả về true nếu cả hai điều kiện đều true. || trả về true nếu ít nhất một điều kiện là true. ! phủ định giá trị boolean.

Toán tử bit

Bây giờ, chúng ta đang bước vào lãnh thổ tiên tiến hơn. Các toán tử bit thực hiện các thao tác trên các biểu diễn nhị phân của số. Đừng lo nếu điều này听起来 phức tạp - chúng ta sẽ phân tích nó!

Dưới đây là bảng các toán tử bit:

Toán tử Mô tả Ví dụ
& Bitwise AND 5 & 3
| Bitwise OR 5 | 3
^ Bitwise XOR 5 ^ 3
~ Bitwise NOT ~5
<< Left shift 5 << 1
>> Right shift 5 >> 1

Hãy xem một ví dụ:

let a: number = 5;  // nhị phân: 0101
let b: number = 3;  // nhị phân: 0011

console.log(a & b);  // Output: 1 (nhị phân: 0001)
console.log(a | b);  // Output: 7 (nhị phân: 0111)
console.log(a ^ b);  // Output: 6 (nhị phân: 0110)
console.log(~a);     // Output: -6 (nhị phân: 1010 trong hai's complement)
console.log(a << 1); // Output: 10 (nhị phân: 1010)
console.log(a >> 1); // Output: 2 (nhị phân: 0010)

Các toán tử này hoạt động trên biểu diễn nhị phân của số. Chúng đặc biệt hữu ích trong lập trình cấp thấp và một số thuật toán.

Toán tử gán

Toán tử gán được sử dụng để gán giá trị cho các biến. Chúng giống như những người vận chuyển của thế giới lập trình, đặt giá trị vào đúng ngôi nhà (biến) của chúng.

Dưới đây là bảng các toán tử gán:

Toán tử Mô tả Ví dụ
= Gán x = 5
+= Cộng và gán x += 3
-= Trừ và gán x -= 2
*= Nhân và gán x *= 4
/= Chia và gán x /= 2
%= Modulus và gán x %= 3

Hãy xem chúng trong hành động:

let x: number = 10;

x += 5;  // tương đương với: x = x + 5
console.log(x);  // Output: 15

x -= 3;  // tương đương với: x = x - 3
console.log(x);  // Output: 12

x *= 2;  // tương đương với: x = x * 2
console.log(x);  // Output: 24

x /= 4;  // tương đương với: x = x / 4
console.log(x);  // Output: 6

x %= 4;  // tương đương với: x = x % 4
console.log(x);  // Output: 2

Các toán tử này là những捷径 làm cho mã của chúng ta ngắn gọn và dễ đọc hơn.

Toán tử linh tinh

TypeScript cũng có một số toán tử khác không thuộc vào các thể loại trước.

Dưới đây là bảng một số toán tử linh tinh:

Toán tử Mô tả Ví dụ
?: Điều kiện (ternary) condition ? expr1 : expr2
, Dấu phẩy let x = (1, 2, 3)
delete Xóa thuộc tính delete obj.property
typeof Kiểu của biến typeof x
void Đánh giá biểu thức và trả về undefined void(0)

Hãy xem một ví dụ về toán tử điều kiện, rất hữu ích:

let age: number = 20;
let canVote: string = age >= 18 ? "Yes" : "No";
console.log(canVote);  // Output: "Yes"

Đây là một cách viết ngắn gọn cho câu lệnh if-else. Nếu điều kiện (age >= 18) là true, nó trả về "Yes", ngược lại là "No".

Toán tử loại

Cuối cùng, hãy xem một số toán tử đặc trưng của TypeScript giúp chúng ta làm việc với các loại.

Dưới đây là bảng các toán tử loại:

Toán tử Mô tả Ví dụ
typeof Lấy loại của biến typeof x
instanceof Kiểm tra nếu một đối tượng là một thể hiện của một lớp obj instanceof Class
as Khẳng định loại (someValue as string).toUpperCase()
Khẳng định loại (cú pháp thay thế) (someValue).toUpperCase()

Hãy xem một ví dụ:

let x: any = "Hello, TypeScript!";
let length: number = (x as string).length;
console.log(length);  // Output: 20

class Animal {}
class Dog extends Animal {}

let myPet = new Dog();
console.log(myPet instanceof Animal);  // Output: true

Trong ví dụ này, chúng ta sử dụng khẳng định loại để báo cho TypeScript biết rằng chúng ta biết x là một chuỗi, mặc dù nó được đánh dấu là any. Chúng ta cũng sử dụng instanceof để kiểm tra xem myPet có phải là một thể hiện của lớp Animal hay không.

Và thế là bạn đã có nó, các bạn! Chúng ta đã cùng nhau hành trình qua vùng đất của các toán tử TypeScript. Nhớ rằng, thực hành là cách tốt nhất để hoàn thiện, vì vậy đừng ngần ngại thử nghiệm các toán tử này trong mã của riêng bạn. Chúc các bạn lập trình vui vẻ!

Credits: Image by storyset