在 JavaScript 中,Symbol 是一種原始數據類型,適合用於創建唯一的標識符。它主要用於避免命名衝突、保護對象的屬性,以及實現元編程。
避免對象屬性名稱的命名衝突。
const uniqueKey1 = Symbol("key");
const uniqueKey2 = Symbol("key");
const obj = {
[uniqueKey1]: "Value for uniqueKey1",
[uniqueKey2]: "Value for uniqueKey2",
};
console.log(obj[uniqueKey1]); // Value for uniqueKey1
console.log(obj[uniqueKey2]); // Value for uniqueKey2
// 無法使用常規方法獲取 Symbol 鍵
console.log(Object.keys(obj)); // []
console.log(Object.getOwnPropertyNames(obj)); // []
console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol(key), Symbol(key) ]
使用 Symbol 添加對象屬性,但不讓它暴露在普通的屬性枚舉中。
const secret = Symbol("secret");
const user = {
name: "Alice",
age: 25,
[secret]: "This is a hidden property",
};
console.log(user[secret]); // This is a hidden property
// 不會被普通的方法列舉出來
for (const key in user) {
console.log(key); // 只會輸出 name 和 age
}
自定義對象的行為,如可迭代性或類型標籤。
自定義迭代器
使用 Symbol.iterator 讓對象可迭代。
const iterableObject = {
data: [1, 2, 3],
[Symbol.iterator]() {
let index = 0;
return {
next: () => {
if (index < this.data.length) {
return { value: this.data[index++], done: false };
} else {
return { done: true };
}
},
};
},
};
for (const value of iterableObject) {
console.log(value); // 1, 2, 3
}
自定義 toStringTag
使用 Symbol.toStringTag 修改 Object.prototype.toString 的結果。
class CustomClass {
get [Symbol.toStringTag]() {
return "CustomClass";
}
}
const instance = new CustomClass();
console.log(Object.prototype.toString.call(instance)); // [object CustomClass]
Symbol 適合用於: