两个 Symbol 永远不会相等
// Symbol 数据类型// 场景1:扩展对象,属性名冲突问题// shared.js ====================================const cache = {}// a.js =========================================cache['a_foo'] = Math.random()// b.js =========================================cache['b_foo'] = '123'console.log(cache)//{ a_foo: 0.8400846012060692, b_foo: '123' }// =========================================================const s = Symbol()console.log(s) // Symbol()console.log(typeof s) // symbol// 两个 Symbol 永远不会相等console.log(Symbol() === Symbol() //false)
Symbol 描述文本
// Symbol 描述文本console.log(Symbol('foo')) // Symbol(foo)console.log(Symbol('bar')) // Symbol(bar)console.log(Symbol('baz')) // Symbol(baz)
Symbol应用场景
使用 Symbol 为对象添加用不重复的键
使用 Symbol 模拟实现私有成员
// 使用 Symbol 为对象添加用不重复的键const obj = {}obj[Symbol()] = '123'obj[Symbol()] = '456'console.log(obj) // { [Symbol()]: '123', [Symbol()]: '456' }// 也可以在计算属性名中使用// const obj = {// [Symbol()]: 123// }// console.log(obj)// =========================================================// 案例2:Symbol 模拟实现私有成员// a.js ======================================const name = Symbol()const person = {[name]: 'zce',say () {console.log(this[name])}}// 只对外暴露 person// b.js =======================================// 由于无法创建出一样的 Symbol 值,// 所以无法直接访问到 person 中的「私有」成员// person[Symbol()]person.say()
如何获取Symbol 属性名
Object.getOwnPropertySymbols(obj)
// Symbol 属性名获取 ---------------------------------------------------const obj = {[Symbol()]: 'symbol value',foo: 'normal value'}// 以下都无法获取// for (var key in obj) {// console.log(key)// }// console.log(Object.keys(obj))// console.log(JSON.stringify(obj))// 正确的获取方法console.log(Object.getOwnPropertySymbols(obj))
Symbol 全局注册表
// Symbol 补充console.log(// Symbol() === Symbol() // falseSymbol('foo') === Symbol('foo') // false)// Symbol 全局注册表 ----------------------------------------------------const s1 = Symbol.for('foo')const s2 = Symbol.for('foo')console.log(s1 === s2) // trueconsole.log(Symbol.for(true) === Symbol.for('true') // true)
内置 Symbol 常量
// 内置 Symbol 常量 ---------------------------------------------------console.log(Symbol.iterator) // Symbol(Symbol.iterator)console.log(Symbol.hasInstance) // Symbol(Symbol.hasInstance)const obj = {[Symbol.toStringTag]: 'XObject'}console.log(obj.toString()) // [object XObject]
