🧠 一句话理解 Symbol
Symbol是 ES6 引入的一种独一无二的原始值类型,主要用于对象属性的唯一标识符,避免命名冲突。
📦 Symbol 的基础用法
✅ 创建 Symbol
const s1 = Symbol();
const s2 = Symbol();
console.log(s1 === s2); // false,每次创建都唯一
✅ 可加描述(用于调试)
const sym = Symbol("desc");
console.log(sym.toString()); // Symbol(desc)
📌 Symbol 的核心用途:作为对象的私有属性键
✅ 1. 防止属性名冲突
const id = Symbol("id");
const user = {
name: "Logan",
[id]: 12345 // 使用 Symbol 做键
};
console.log(user[id]); // 12345
这样 id 这个属性就不会和别的属性冲突,即使别人也用了 "id"。
✅ 2. 定义私有属性 / 隐藏属性
Symbol 属性不会被 for...in、Object.keys()、JSON.stringify() 枚举出来:
for (let key in user) {
console.log(key); // 只输出 name,不输出 Symbol(id)
}
这是构建“伪私有属性”的方式之一。
🚀 实际应用场景
✅ 应用 1:作为对象中的唯一键
比如你做了一个插件,要往别人的对象里加属性,不希望污染全局属性名空间:
const _pluginState = Symbol("pluginState");
obj[_pluginState] = { ... };
✅ 应用 2:模拟私有属性
const _password = Symbol("password");
class User {
constructor(pwd) {
this[_password] = pwd;
}
checkPassword(pwd) {
return this[_password] === pwd;
}
}
_password 是隐藏的,不会被枚举出来,也不会意外覆盖。
✅ 应用 3:内置 Symbol 拓展语言能力
JavaScript 还内置了几个特殊用途的 Symbol,如:
| Symbol | 用途说明 |
|---|---|
Symbol.iterator |
定义对象的迭代行为(for...of) |
Symbol.toPrimitive |
定义对象转换为原始值的方式 |
Symbol.toStringTag |
定义 Object.prototype.toString() 的返回值 |
const obj = {
[Symbol.toPrimitive](hint) {
return hint === "string" ? "Logan" : 100;
}
};
console.log(`${obj}`); // Logan
console.log(obj + 10); // 110
🚫 注意事项
Symbol不能参与运算(除非转换)- 不能用
new Symbol()创建(会报错) - Symbol 不是真正意义的“私有”,可以通过
Object.getOwnPropertySymbols()拿到
✅ 总结一句话:
Symbol是一个用来创建唯一键名的原始类型,适用于构建隐藏属性、避免命名冲突、定义协议式接口等高级用法。