ES6 Symbol类型
2019-10-11 本文已影响0人
noyanse
每个Symbol实例都是唯一的
应用场景:
- 使用Symbol来作为对象属性名(key)
- Symbol类型的key是不能通过Object.keys()或者for...in来枚举的,
利用该特性,我们可以把一些不需要对外操作和访问的属性使用Symbol来定义。 - 当使用JSON.stringify()将对象转换成JSON字符串的时候,Symbol属性也会被排除在输出内容之外
- 可以利用这一特点来更好的设计我们的数据对象,让“对内操作”和“对外选择性输出”变得更加优雅
获取Symbol属性
// 使用Object的API
Object.getOwnPropertySymbols(obj)
// 使用新增的反射API
Reflect.ownKeys(obj)
注册和获取全局Symbol
通常情况下,我们在一个浏览器窗口中(window),使用Symbol()函数来定义和Symbol实例就足够了。但是,如果你的应用涉及到多个window(最典型的就是页面中使用了<iframe>),并需要这些window中使用的某些Symbol是同一个,那就不能使用Symbol()函数了,因为用它在不同window中创建的Symbol实例总是唯一的,而我们需要的是在所有这些window环境下保持一个共享的Symbol。这种情况下,我们就需要使用另一个API来创建或获取Symbol,那就是Symbol.for(),它可以注册或获取一个window间全局的Symbol实例:
let gs1 = Symbol.for('global_symbol_1') //注册一个全局Symbol
let gs2 = Symbol.for('global_symbol_1') //获取全局Symbol
gs1 === gs2 // true
这样一个Symbol不光在单个window中是唯一的,在多个相关window间也是唯一的了。