两个 Symbol 永远不会相等

  1. // Symbol 数据类型
  2. // 场景1:扩展对象,属性名冲突问题
  3. // shared.js ====================================
  4. const cache = {}
  5. // a.js =========================================
  6. cache['a_foo'] = Math.random()
  7. // b.js =========================================
  8. cache['b_foo'] = '123'
  9. console.log(cache)//{ a_foo: 0.8400846012060692, b_foo: '123' }
  10. // =========================================================
  11. const s = Symbol()
  12. console.log(s) // Symbol()
  13. console.log(typeof s) // symbol
  14. // 两个 Symbol 永远不会相等
  15. console.log(
  16. Symbol() === Symbol() //false
  17. )

Symbol 描述文本

  1. // Symbol 描述文本
  2. console.log(Symbol('foo')) // Symbol(foo)
  3. console.log(Symbol('bar')) // Symbol(bar)
  4. console.log(Symbol('baz')) // Symbol(baz)

Symbol应用场景

使用 Symbol 为对象添加用不重复的键
使用 Symbol 模拟实现私有成员

  1. // 使用 Symbol 为对象添加用不重复的键
  2. const obj = {}
  3. obj[Symbol()] = '123'
  4. obj[Symbol()] = '456'
  5. console.log(obj) // { [Symbol()]: '123', [Symbol()]: '456' }
  6. // 也可以在计算属性名中使用
  7. // const obj = {
  8. // [Symbol()]: 123
  9. // }
  10. // console.log(obj)
  11. // =========================================================
  12. // 案例2:Symbol 模拟实现私有成员
  13. // a.js ======================================
  14. const name = Symbol()
  15. const person = {
  16. [name]: 'zce',
  17. say () {
  18. console.log(this[name])
  19. }
  20. }
  21. // 只对外暴露 person
  22. // b.js =======================================
  23. // 由于无法创建出一样的 Symbol 值,
  24. // 所以无法直接访问到 person 中的「私有」成员
  25. // person[Symbol()]
  26. person.say()

如何获取Symbol 属性名

Object.getOwnPropertySymbols(obj)

  1. // Symbol 属性名获取 ---------------------------------------------------
  2. const obj = {
  3. [Symbol()]: 'symbol value',
  4. foo: 'normal value'
  5. }
  6. // 以下都无法获取
  7. // for (var key in obj) {
  8. // console.log(key)
  9. // }
  10. // console.log(Object.keys(obj))
  11. // console.log(JSON.stringify(obj))
  12. // 正确的获取方法
  13. console.log(Object.getOwnPropertySymbols(obj))

Symbol 全局注册表

  1. // Symbol 补充
  2. console.log(
  3. // Symbol() === Symbol() // false
  4. Symbol('foo') === Symbol('foo') // false
  5. )
  6. // Symbol 全局注册表 ----------------------------------------------------
  7. const s1 = Symbol.for('foo')
  8. const s2 = Symbol.for('foo')
  9. console.log(s1 === s2) // true
  10. console.log(
  11. Symbol.for(true) === Symbol.for('true') // true
  12. )

内置 Symbol 常量

  1. // 内置 Symbol 常量 ---------------------------------------------------
  2. console.log(Symbol.iterator) // Symbol(Symbol.iterator)
  3. console.log(Symbol.hasInstance) // Symbol(Symbol.hasInstance)
  4. const obj = {
  5. [Symbol.toStringTag]: 'XObject'
  6. }
  7. console.log(obj.toString()) // [object XObject]