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.
Related
list
from [[JS Symbols]]
Resources
Footnotes
-
xem thêm JS Data Types. ↩
-
xem thêm JS Objects. ↩