Là một kiểu dữ liệu thuộc loại primitive1.

Creating Symbol

Khởi tạo bằng cách dùng constructor của Symbol và truyền vào một chuỗi (ta gọi chuỗi này là description của symbol).

// Creating symbol
const symbol = Symbol()
 
typeof symbol // symbol

Hai đối tượng symbol có cùng description sẽ không giống nhau do mỗi đối tượng đều là duy nhất:

// Two symbols with the same description
 
const symbol1 = Symbol('hello')
const symbol2 = Symbol('hello')
 
console.log(symbol1 === symbol2) // false

Access Symbol Description

Truy cập đến description của symbol thông qua thuộc tính description:

const symbol = Symbol('hey')
 
console.log(symbol.description) // hey

Add Symbol as an Object Key

Chúng ta có thể dùng symbol để làm object key bằng cách dùng toán tử []:

let id = Symbol("id")
 
let person = {
    name: "Jack",
 
    // Adding symbol as a key
    [id]: 123 // not "id": 123
}
 
console.log(person) // {name: "Jack", Symbol(id): 123}

Các thuộc tính sử dụng symbol làm key sẽ không xuất hiện ở trong vòng lặp for in:

let id = Symbol("id")
 
let person = {
    name: "Jack",
    age: 25,
    [id]: 12
}
 
// using for...in
for (let key in person) {
    console.log(key)
}

Output:

name
age

Benefit of Using Symbols in Object.

Kiểu symbol thường được dùng để tạo ra các thuộc tính không trùng lặp trong đối tượng.

Trong đoạn code bên dưới, nếu object person được dùng ở những chương trình khác, có thể xảy ra trường hợp các chương trình đều thêm vào object cùng một thuộc tính id và dẫn đến thuộc tính thêm vào sau sẽ override giá trị trước đó2.

let person = {
    name: "Jack"
}
 
// Using string as key
person.id = 12
console.log(person.id) // 12
 
// Another program overwrites value
person.id = 'Another value'
console.log(person.id) // Another value

Để giải quyết vấn đề trên, ta có thể dùng key có kiểu là symbol:

let person = {
    name: "Jack"
};
 
let id = Symbol("id");
 
person[id] = 12;

Chương trình khác cũng làm tương tự:

let person = {
    name: "Jack"
};
 
let id = Symbol("id");
 
person[id] = "Another value";

Cách làm này giúp giải quyết vấn đề trùng lặp key của các thuộc tính giữa nhiều chương trình khác nhau.

list
from [[JS Symbols]]

Resources

Footnotes

  1. xem thêm JS Data Types.

  2. xem thêm JS Objects.