js symbol实现
Symbol 的基本概念
Symbol 是 JavaScript 中的一种原始数据类型,每个 Symbol 值都是唯一的,不可变的。通常用于对象属性的键,以避免属性名冲突。
创建 Symbol
使用 Symbol() 函数可以创建一个新的 Symbol:
const sym1 = Symbol();
const sym2 = Symbol('description'); // 可选的描述字符串
描述字符串仅用于调试,不影响 Symbol 的唯一性。
Symbol 的唯一性
即使描述相同,Symbol 也是唯一的:
const sym1 = Symbol('foo');
const sym2 = Symbol('foo');
console.log(sym1 === sym2); // false
全局 Symbol 注册表
通过 Symbol.for() 可以在全局注册表中创建或获取 Symbol:
const sym1 = Symbol.for('foo'); // 创建或获取全局 Symbol
const sym2 = Symbol.for('foo');
console.log(sym1 === sym2); // true
使用 Symbol.keyFor() 可以获取全局 Symbol 的描述:
const sym = Symbol.for('foo');
console.log(Symbol.keyFor(sym)); // 'foo'
Symbol 作为对象属性
Symbol 可以用作对象属性的键,避免属性名冲突:
const obj = {};
const sym = Symbol('key');
obj[sym] = 'value';
console.log(obj[sym]); // 'value'
内置 Symbol
JavaScript 提供了一些内置 Symbol,用于自定义对象行为:
Symbol.iterator: 定义对象的默认迭代器Symbol.toStringTag: 自定义对象的toString行为Symbol.hasInstance: 自定义instanceof操作符的行为
遍历 Symbol 属性
使用 Object.getOwnPropertySymbols() 可以获取对象的所有 Symbol 属性:
const obj = {};
const sym = Symbol('key');
obj[sym] = 'value';
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(key)]
Symbol 的不可变性
Symbol 值一旦创建就无法更改,也不能被隐式转换为字符串或数字:

const sym = Symbol('foo');
console.log(String(sym)); // 'Symbol(foo)'
console.log(sym + ''); // TypeError






