搞懂Symbol类型


🧠 一句话理解 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...inObject.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 是一个用来创建唯一键名的原始类型,适用于构建隐藏属性、避免命名冲突、定义协议式接口等高级用法。


Cookies、localStorage、sessionStorage、IndexedDB的概念与语法

20 道 JavaScript 基础面试题及标准答案

评 论
请登录后再评论