一、什么是Symbol?
在JavaScript中,Symbol是ES6引入的一种原始数据类型,用于生成全局唯一的标识符。它的核心特性是不可变性和唯一性,即使两个Symbol拥有相同的描述(description),它们的值也永远不会相等(Symbol('foo') !== Symbol('foo')
)
Symbol本质上是一个函数,调用它会返回一个Symbol类型的值。你可以选择性地给Symbol添加一个描述,方便调试和识别。
const sym1 = Symbol();
const sym2 = Symbol("这是一个描述");
console.log(sym1); // Symbol()
console.log(sym2); // Symbol(这是一个描述)
console.log(sym1 === sym2); // false
二、Symbol的三大核心特性
-
唯一性:
每个Symbol都是独一无二的,适合作为对象的“隐藏”属性键。const key1 = Symbol('id'); const key2 = Symbol('id'); console.log(key1 === key2); // false
-
不可枚举性:
Symbol属性默认不会出现在for...in
、Object.keys()
或JSON.stringify()
中。const obj = { [Symbol('secret')]: 'value' }; console.log(Object.keys(obj)); // [] // 需通过Object.getOwnPropertySymbols()访问 console.log(Object.getOwnPropertySymbols(obj).length); // 1
-
全局共享Symbol:
使用Symbol.for(key)
可在全局注册表中创建或获取Symbol。相同key
的Symbol会复用,适合跨模块共享。const s1 = Symbol.for('global'); const s2 = Symbol.for('global'); console.log(s1 === s2); // true console.log(Symbol.keyFor(s1)); // 'global'