[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 。
~~~
- Javascript基础篇
- Array数组
- 数组插入值
- filter()
- forEach()
- push()
- pop()
- unshift()
- shift()
- valueOf()
- 面向对象思想
- Javascript 面向对象编程(一):封装
- Javascript面向对象编程(二):构造函数的继承
- Javascript面向对象编程(三):非构造函数的继承
- 解构
- 数组的解构赋值
- 对象的解构赋值
- 函数参数解构
- 字符串的解构赋值
- 数值和布尔值的解构赋值
- 圆括号问题
- 字符串.
- split()
- charAt()
- charCodeAt()
- concat()
- indexOf()
- lastIndexOf()
- match()
- replace()
- includes()
- 初识递归
- 渲染ul-li树形结构
- 异步函数解决方案
- 1. callback回调函数
- 2. ES6 - Promise
- JavaScript高级程序设计(书)
- 在html中使用JavaScript
- script标签的位置
- 延迟脚本
- 异步脚本
- <noscript>元素
- 基本概念
- 严格模式
- 变量详解
- 数据类型
- typeof操作符
- undefined类型
- Null类型
- Boolean类型
- Number类型
- 深入了解ES6(书)
- var 、let 、 const
- 字符串与正则表达式
- 字符串
- 正则表达式
- 函数
- 函数形参默认值
- 使用不具名参数
- 函数构造器的增强能力
- 扩展运算符
- name属性
- 明确函数的多重用途
- 块级函数
- 箭头函数
- 尾调用优化
- 扩展的对象功能
- 对象类别
- 对象字面量语法的扩展
- ES6对象新增方法
- 重复的对象属性
- 自有属性的枚举顺序
- 更强大的原型
- 解构:更方便的数据访问
- 为什么要用解构?
- 对象解构
- 数组解构
- 混合解构
- 参数解构
- Symbol与Symbol属性
- 创建Symbol
- Symbol的使用方法
- Symbol全局私有属性
- Symbol与类型强制转换
- Symbol属性检索
- Symbol的一些构造方法
- Set集合与Map集合
- Set集合
- Weak Set集合(弱引用Set集合)
- Map集合
- JS标准内置对象
- Object 构造函数及属性
- Object 构造方法
- Symbol 内建对象类的函数及属性
- Set 构造函数及属性
- Weak Set 构造函数及属性
- JS杂项
- 类数组对象
- Class类的理解和使用