JavaScript ES6 Symbol底层实现:如何实现唯一性与for机制?
JavaScript Symbol 唯一性与Symbol.for共享的底层实现原理
一、普通Symbol的唯一性实现
每次调用Symbol(description)时,JavaScript引擎都会在内存中生成一个全新的、独立的内部值实例。这个实例和其他任何Symbol(哪怕描述参数description完全相同)都指向不同的内存地址。
举个直观的例子:
const a = Symbol('key') const b = Symbol('key') a !== b // true
这里的'key'只是给Symbol添加的调试描述信息,完全不参与唯一性判断。引擎判断两个Symbol是否相等,唯一依据是它们是否为内存中的同一个实例——就像你两次调用{}创建的空对象永远不相等,逻辑是一致的,只是Symbol是语言原生的不可重复值类型。
二、Symbol.for()的共享机制
JavaScript引擎内部维护了一个全局Symbol注册表(可以理解为一个以字符串为键、Symbol实例为值的Map结构),专门用于Symbol.for()的实例共享:
- 当调用
Symbol.for('key')时,引擎会先检查全局注册表中是否存在以'key'为键的Symbol实例; - 如果存在,直接返回该已有的实例;
- 如果不存在,才会创建一个新的Symbol实例,同时将该实例与
'key'绑定存入注册表中。
所以下面的代码会返回true:
const a = Symbol.for('key') const b = Symbol.for('key') a === b // true
第二次调用Symbol.for('key')时,直接从全局注册表中取出了第一次创建的Symbol实例,自然指向同一块内存地址。
额外补充:Symbol.keyFor(symbol)方法可以反向查询全局注册表,返回对应Symbol的键;但普通Symbol实例不在注册表中,所以调用Symbol.keyFor(Symbol('key'))会返回undefined。
内容的提问来源于stack exchange,提问作者agartede
相关产品推荐
相关产品推荐

