symbol数据类型的用途
ES6 的 Symbol 是一种独特的原始数据类型,用于生成唯一的标识符。它的主要特点是每次创建的 Symbol 值都是唯一的,即使描述相同,也不会相等。
1.定义对象的唯一属性键,防止命名冲突
在对象中定义键值时,通常使用字符串作为键,但这可能导致命名冲突。而使用 Symbol 作为键可以确保属性的唯一性,避免冲突。
const uniqueKey1 = Symbol("key");
const uniqueKey2 = Symbol("key");
const obj = {
[uniqueKey1]: "value1",
[uniqueKey2]: "value2",
};
console.log(obj[uniqueKey1]); // 输出 "value1"
console.log(obj[uniqueKey2]); // 输出 "value2"
console.log(uniqueKey1 === uniqueKey2); // 输出 false
2.实现类的私有属性
虽然 JavaScript 没有真正的私有属性(直到 # 私有字段的引入),但 Symbol 可用于模拟私有属性,因为它们不会出现在常规的对象遍历中(如 for...in、Object.keys())。
const privateKey = Symbol("privateKey");
class MyClass {
constructor() {
this[privateKey] = "This is private";
}
getPrivate() {
return this[privateKey];
}
}
const instance = new MyClass();
console.log(instance.getPrivate()); // 输出 "This is private"
console.log(instance[privateKey]); // 无法直接访问私有属性
3.自定义对象行为(与 Symbol.* 一起使用)
Symbol 提供了一些内置的静态属性(如 Symbol.iterator、Symbol.toStringTag 等),可以用来定制对象的行为。例如实现自定义迭代器或修改对象的默认字符串描述。
const myIterable = {
data: [1, 2, 3],
[Symbol.iterator]() {
let index = 0;
const data = this.data;
return {
next() {
if (index < data.length) {
return { value: data[index++], done: false };
} else {
return { value: undefined, done: true };
}
},
};
},
};
for (const value of myIterable) {
console.log(value); // 输出 1, 2, 3
}
修改对象的默认描述:
const obj = {
[Symbol.toStringTag]: "CustomObject",
};
console.log(obj.toString()); // 输出 "[object CustomObject]"

浙公网安备 33010602011771号