ECMAScript -18 Symbol 扩展

console.info(
  Symbol('a') === Symbol('a') // 永远不会相等
)
const s1 = Symbol.for('foo') // 字符串作为参数,相同的字符串返回相同的Symbol值
const s2 = Symbol.for('foo')
console.info(s1 === s2) // true

// 如果传入的不是字符串会转换成字符串
console.info(Symbol.for('true') === Symbol.for(true)) // true
const obj = {}
info(obj.toString()) // >>>> [object Object] toString标签

const obj = {
  [Symbol.toStringTag]: 'XObject' // toStringTag 内置的Symbol对象
}
info(obj.toString()) // >>>> [object XObject]


const obj = {
  [Symbol.toStringTag]: 'XObject' // toStringTag 内置的Symbol对象
}
console.info(obj.toString()) // >>>> [object XObject]

const obj = {
  [Symbol.toStringTag]: 'CustomerObject' // toStringTag 内置的Symbol对象
}
console.info(obj.toString()) // >>>> [object CustomerObject]
const name1 = Symbol()
const name2 = Symbol()
const name3 = Symbol()

const obj = {
  [name1]: 'Symbol value 1',
  [name2]: 'Symbol value 2',
  [name3]: 'Symbol value 3',
  foo: 'normal value'
}

// 🚀🚀🚀🚀  以下3种方式都无法拿到Symbol类型的属性  🚀🚀🚀🚀
// 1
for (var key in obj) {
  console.info(key) // foo,无法拿到Symbol类型的属性名
}
// 2.
console.info(Object.keys(obj)) // [ 'foo' ]
// 3.
console.info(JSON.stringify(obj)) // {"foo":"normal value"}

// 所以特别适合作为对象的私有属性

// 🚀🚀🚀 如何获取对象的Symbol属性 和 value 🚀🚀🚀

console.info(Object.getOwnPropertySymbols(obj)) // [ Symbol() ]

const syms = Object.getOwnPropertySymbols(obj)
for (let i = 0; i < syms.length; i++) {
  console.info(syms[i])
  console.info(obj[syms[i]])
}

// 输出结果
// Symbol() Symbol value 1
// Symbol() Symbol value 2
// Symbol() Symbol value 3
posted @ 2020-08-18 22:22  荣光无限  阅读(73)  评论(0)    收藏  举报