不需要对外操作和访问的属性使用Symbol来定义
使用JSON.stringify()
将对象转换成JSON字符串的时候,Symbol属性也会被排除在输出内容之外
所以:
场景一:利用这一特点来更好的设计我们的数据对象,让“对内操作”和“对外选择性输出”变得更加优雅。
Object.getOwnPropertySymbols(obj) // [Symbol(name)]
// 使用新增的反射API
Reflect.ownKeys(obj) // [Symbol(name), 'age', 'title']
Symbol类型的key是不能通过Object.keys()
或者for...in
来枚举的
Object.getOwnPropertyNames(obj) 也获取不到symbol
Object.getOwnPropertyNames(obj)
场景二:使用Symbol来替代常量
使用方法:
const TYPE_AUDIO = Symbol()
const TYPE_VIDEO = Symbol()
const TYPE_IMAGE = Symbol()
场景三:设置私有属性
实例上访问不到symbol属性
场景四:
注册和获取全局Symbol
let gs1 = Symbol.for('global_symbol_1') //注册一个全局Symbol
let gs2 = Symbol.for('global_symbol_1') //获取全局Symbol
gs1 === gs2 // true
场景五:
iterator迭代器
参考:https://www.jianshu.com/p/f40a77bbd74e