JavaScript - Đối tượng Ký hiệu

Xin chào các bạn đang học JavaScript! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của các Ký hiệu JavaScript. Đừng lo lắng nếu bạn mới bắt đầu học lập trình; tôi sẽ hướng dẫn bạn từng bước qua khái niệm này, cũng như tôi đã làm cho hàng trăm sinh viên trong những năm dạy học của mình. Vậy, chúng ta cùng bắt đầu nhé!

JavaScript - Symbol

Ký hiệu JavaScript

Hãy tưởng tượng bạn đang tham gia một buổi tiệc mặt nạ sang trọng. Mọi người đều đeo mặt nạ, và mỗi mặt nạ đều duy nhất. Trong thế giới JavaScript, các Ký hiệu giống như những mặt nạ này - chúng là những bộ định danh duy nhất giúp chúng ta phân biệt một thứ với một thứ khác, ngay cả khi chúng trông相似 ban đầu.

Ký hiệu là một kiểu dữ liệu nguyên thủy trong JavaScript, được giới thiệu trong ECMAScript 2015 (ES6). Nó khác với các kiểu nguyên thủy khác như chuỗi hoặc số vì mỗi Ký hiệu đều đảm bảo duy nhất.

Hãy tạo Ký hiệu đầu tiên của chúng ta:

const mySymbol = Symbol();
console.log(mySymbol);  // Output: Symbol()

Ở đây, chúng ta đã tạo một Ký hiệu và lưu trữ nó trong biến mySymbol. Khi chúng ta đăng nhập nó vào console, chúng ta thấy Symbol(). Nhưng đừng để bị lừa - mỗi khi bạn tạo một Ký hiệu, nó là một bộ định danh mới, duy nhất.

Cú pháp

Tạo một Ký hiệu rất đơn giản. Bạn có thể làm theo hai cách:

  1. Không có mô tả:

    const sym1 = Symbol();
  2. Với mô tả:

    const sym2 = Symbol('My description');

Mô tả là tùy chọn và chủ yếu được sử dụng cho mục đích gỡ lỗi. Nó không ảnh hưởng đến tính duy nhất của Ký hiệu.

Đây là một điều thú vị: bạn không thể sử dụng từ khóa new với Ký hiệu. Nếu bạn thử new Symbol(), JavaScript sẽ ném một lỗi. Nó giống như cố gắng sao chép một mặt nạ duy nhất ở buổi tiệc mặt nạ của chúng ta - nó chỉ đơn giản là không hoạt động!

Các thuộc tính của Ký hiệu

Ký hiệu có một số thuộc tính thú vị. Hãy cùng khám phá:

Symbol.length

console.log(Symbol.length);  // Output: 0

Điều này luôn trả về 0. Nó giống như hỏi có bao nhiêu người đeo một mặt nạ duy nhất tại buổi tiệc của chúng ta - luôn chỉ có một người!

Symbol.prototype

Đây là prototype cho constructor Ký hiệu. Nó hơi nâng cao, vì vậy chúng ta sẽ để dành cho một ngày khác.

Các phương thức Ký hiệu

Ký hiệu đi kèm với một số phương thức hữu ích. Hãy cùng nhìn qua một vài phương thức:

Phương thức Mô tả
Symbol.for(key) Tìm kiếm các ký hiệu hiện có với khóa được cung cấp và trả về nó nếu tìm thấy. Nếu không, một ký hiệu mới sẽ được tạo và trả về.
Symbol.keyFor(sym) Truy xuất khóa ký hiệu chia sẻ từ sổ đăng ký ký hiệu toàn cục cho ký hiệu được cung cấp.
toString() Trả về một biểu diễn chuỗi của ký hiệu.

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

const globalSymbol = Symbol.for('myGlobalSymbol');
console.log(Symbol.keyFor(globalSymbol));  // Output: "myGlobalSymbol"

const localSymbol = Symbol('myLocalSymbol');
console.log(Symbol.keyFor(localSymbol));  // Output: undefined

console.log(localSymbol.toString());  // Output: "Symbol(myLocalSymbol)"

Trong ví dụ này, globalSymbol giống như một mặt nạ đã được đăng ký tại lối vào buổi tiệc của chúng ta. Bất kỳ ai cũng có thể yêu cầu nó theo tên. localSymbol, mặt khác, giống như một mặt nạ bạn tự làm - nó duy nhất với bạn, và không ai khác biết về nó.

Ví dụ

Hãy nhìn qua một số ví dụ thực tế về việc sử dụng Ký hiệu:

Ví dụ 1: Sử dụng Ký hiệu làm khóa duy nhất của thuộc tính

const NAME = Symbol('name');
const AGE = Symbol('age');

const person = {
[NAME]: 'Alice',
[AGE]: 30
};

console.log(person[NAME]);  // Output: "Alice"
console.log(person[AGE]);   // Output: 30

Trong ví dụ này, chúng ta đang sử dụng Ký hiệu làm khóa trong một đối tượng. Điều này đảm bảo rằng các thuộc tính này sẽ không va chạm với bất kỳ thuộc tính nào khác, ngay cả khi chúng có cùng tên.

Ví dụ 2: Ký hiệu trong vòng lặp for...in

const VISIBLE = Symbol('visible');
const HIDDEN = Symbol('hidden');

const obj = {
[VISIBLE]: 'This is visible',
[HIDDEN]: 'This is hidden',
normalProperty: 'This is normal'
};

for (let prop in obj) {
console.log(prop);  // Output: "normalProperty"
}

Chú ý rằng các thuộc tính Ký hiệu không được bao gồm trong vòng lặp for...in. Nó giống như chúng đang đeo áo choàng vô hình trong buổi tiệc mặt nạ của chúng ta!

Lợi ích của việc sử dụng Ký hiệu

  1. Độc nhất: Ký hiệu luôn duy nhất. Điều này làm cho chúng hoàn hảo để thêm thuộc tính vào các đối tượng khi bạn muốn chắc chắn rằng bạn không đang ghi đè lên các thuộc tính hiện có.

  2. Riêng tư: Các thuộc tính được khóa bằng Ký hiệu không thể được đếm bằng mặc định. Điều này có nghĩa là chúng không xuất hiện trong các vòng lặp for...in hoặc Object.keys().

  3. Tránh va chạm: Khi làm việc với các mã lớn hoặc các thư viện của bên thứ ba, Ký hiệu giúp ngăn ngừa va chạm tên.

  4. Các hành vi đặc biệt: Một số Ký hiệu xây dựng sẵn cho phép bạn tùy chỉnh hành vi của đối tượng. Ví dụ, Symbol.iterator cho phép bạn xác định cách một đối tượng nên được迭代.

Cuối cùng, Ký hiệu giống như những握手 bí mật trong thế giới JavaScript. Chúng cung cấp một cách để tạo ra các bộ định danh duy nhất có thể được sử dụng theo nhiều cách khác nhau để cải thiện chức năng và khả năng bảo trì mã của bạn.

Nhớ rằng, cũng như mỗi mặt nạ tại buổi tiệc mặt nạ của chúng ta là duy nhất và đặc biệt, các Ký hiệu trong JavaScript cũng vậy. Chúng có thể看起来 bí ẩn ban đầu, nhưng với sự luyện tập, bạn sẽ thấy chúng là những công cụ mạnh mẽ trong bộ công cụ lập trình của bạn.

Tiếp tục lập mã, tiếp tục học hỏi, và quan trọng nhất, hãy vui vẻ trong hành trình JavaScript của bạn!

Credits: Image by storyset