ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] >[success] # Symbol全局私有属性 ~~~ 假设你想'在同一个文件2个对象中使用同一个Symbol属性',或者说'在2个js文件的对象中使用同一个Symbol属性' 跨越文件或代码来追踪'Symbol'是很困难并且易错的。 为此'ES6'为了这种情况出了一个属性'Symbol.for()'方法来定义共享的'Symbol'属性,'Symbol.for()'方法 仅接受'单个字符串类型的参数',作为目标'Symbol'的标识符,同时此参数也会成为该'Symbol'的描述信息。 例如: ~~~ ~~~ // 创建一个全局的Symbol私有属性 let uid = Symbol.for("uid") // 在对象中使用这个uid私有属性 let object = { [uid]: '12345' } console.log(object[uid]) // "12345" console.log(uid) // "Symbol(uid)" ~~~ <br/> >[success] ## Symbol.for() 注册全局Symbol ~~~ 'Symbol.for()'方法首先会搜索'全局Symbol注册表',看是否存在一个键值为 "uid" 的'Symbol'。如果存在, 该方法会'返回这个已存在的Symbol',否则,会创建一个新的'Symbol',并使用该键值将其记录到全局'Symbol' 注册表中,然后'返回这个新的Symbol'。这就意味着此后使用同一个键值去调用'Symbol.for()'方法都将会 '返回同一个Symbol',就像下面这个例子: ~~~ ~~~ // 创建一个全局的Symbol let uid = Symbol.for("uid") // 在对象中使用这个uid私有属性 let object = { [uid]: "12345" } console.log(object[uid]) // "12345" console.log(uid) // "Symbol(uid)" // 查看全局Symbol注册表中是否有uid,如果有就使用现有的,如果没有就创建新的Symbol let uid2 = Symbol.for("uid") console.log(uid === uid2) // true console.log(object[uid2]) // "12345" console.log(uid2) // "Symbol(uid)" ~~~ ~~~ 上面例子中,'uid'与'uid2'包含同一个'Symbol',因此它们可以互换使用。第一次调用'Symbol.for()'创建 了这个'Symbol',而第二次调用则从'全局Symbol注册表'中将其检索了出来。 ~~~ <br/> >[success] ## Symbol.keyFor() 根据私有属性名称,搜索全局Symbol注册表 ~~~ 你可以使用'Symbol.keyFor()'方法在'全局Symbol注册表'中根据'Symbol'检索出对应的键值,例如: ~~~ ~~~ let uid = Symbol.for("uid") console.log(Symbol.keyFor(uid)) // "uid" let uid2 = Symbol.for("uid") console.log(Symbol.keyFor(uid2)) // "uid" let uid3 = Symbol("uid") console.log(Symbol.keyFor(uid3)) // undefined,因为全局Symbol注册表中没有uid3,uid3是局部的 ~~~ ~~~ 使用Symbol uid 与 uid2 都返回了键值 "uid" ,而Symbol uid3 在全局符号注册表中并不存在,因此没有关联 的键值, Symbol.keyFor() 方法只会返回 undefined 。 ~~~