ES6 Symbol类型

2019-10-11  本文已影响0人  noyanse

每个Symbol实例都是唯一的

应用场景:

  1. 使用Symbol来作为对象属性名(key)
  2. Symbol类型的key是不能通过Object.keys()或者for...in来枚举的,
    利用该特性,我们可以把一些不需要对外操作和访问的属性使用Symbol来定义。
  3. 当使用JSON.stringify()将对象转换成JSON字符串的时候,Symbol属性也会被排除在输出内容之外
  4. 可以利用这一特点来更好的设计我们的数据对象,让“对内操作”和“对外选择性输出”变得更加优雅

获取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间也是唯一的了。

上一篇下一篇

猜你喜欢

热点阅读