JavaScript中Symbol.keyFor()相比Symbol.prototype.description是否有使用优势?
关于Symbol.prototype.description与Symbol.keyFor()的区别与适用场景
问题1:二者的其他区别
除了你提到的适用范围差异,二者还有3个核心区别:
- 本质定位不同
description是Symbol实例的只读属性,仅作为该Symbol的附加描述信息,没有全局唯一约束,多个不同的Symbol可以拥有完全相同的description值。Symbol.keyFor()是全局Symbol注册表的查询方法,返回的是和目标Symbol唯一绑定的全局注册键,全局注册表中每个key对应唯一的Symbol,反过来每个全局Symbol也对应唯一的key。 - 对内置Symbol的返回结果不同
所有JS内置Symbol(比如Symbol.iterator、Symbol.toStringTag)都有明确的description值,比如Symbol.iterator.description返回Symbol.iterator,但它们都没有在全局注册表登记,所以Symbol.keyFor(Symbol.iterator)返回undefined。 - 空参数场景的返回差异
如果你创建Symbol时没有传描述参数:const s = Symbol(),它的description是undefined;
但如果你注册全局Symbol时传undefined:const s = Symbol.for(undefined),参数会被强制转为字符串'undefined'作为全局key,此时Symbol.keyFor(s)返回字符串'undefined',和前者的返回类型、值都有差异。
问题2:优先使用Symbol.keyFor()的场景
存在两类明确优先使用Symbol.keyFor()的场景:
- 需要判断Symbol是否为全局注册的场景
如果你要校验目标Symbol是不是来自全局Symbol注册表,直接判断Symbol.keyFor(symbol) !== undefined即可,description完全无法实现这个校验——非全局的Symbol完全可以和全局Symbol有相同的描述。 - 需要跨上下文还原Symbol的场景
如果你要把Symbol做序列化传递(比如跨iframe、跨Worker、存入本地存储后读取还原),只有全局注册的Symbol可以通过Symbol.keyFor()拿到全局key,再在另一个执行上下文通过Symbol.for(key)还原出完全相同的Symbol实例。如果用description来做还原,很可能拿到的是另一个完全不同的非全局Symbol,导致逻辑错误。
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

