Symbol
基础知识
声明
const mk = Symbol()
const mk2 = Symbol()
console.log(mk == mk2)
Symbol 不可以添加属性
描述参数
可传入字符串用于描述Symbol,方便在控制台分辨Symbol
const mk = Symbol('mkimq')
// 使用description可以获取传入的描述参数
console.log(mk.description)
传入相同参数Symbol也是独立唯一的,因为参数只是描述而已,但使用 Symbol.for则不会
Symbol.for
根据描述获取Symbol,如果不存在则新建一个Symbol
- 使用Symbol.for会在系统中将Symbol登记
- 使用Symbol则不会登记
const mk = Symbol('mkimq')
const mk2 = Symbol('mkimq')
console.log(mk === mk2)
Symbol.keyFor
Symbol.keyFor 根据使用Symbol.for登记的Symbol返回描述,如果找不到返回undefined 。
const mk = Symbol.for('mkimq')
console.log(Symbol.keyFor(mk)) // mkimq
const mk2 = Symbol('mkimq')
console.log(Symbol.keyFor(mk2)) // undefined
对象属性
Symbol 是独一无二的所以可以保证对象属性的唯一。
- Symbol 声明和访问使用 [](变量)形式操作
- 也不能使用 . 语法因为 .语法是操作字符串属性的。
const symbol = Symbol('mkimq')
const obj = {
[symbol]: 'mkimq.com'
}
console.log(obj[symbol])
实例操作
缓存操作
使用Symbol可以解决在保存数据时由于名称相同造成的耦合覆盖问题。
遍历属性
Symbol 不能使用 for/in、for/of 遍历操作
const symbol = Symbol('mkimq')
const obj = {
name: 'mkimq.com',
[symbol]: 'mkimq'
}
for (const key in obj) {
console.log(key)
}
for (const key of Object.keys(obj)) {
console.log(key)
}
可以使用 Object.getOwnPropertySymbols 获取所有Symbol属性
for (const key of Object.getOwnPropertySymbols(obj)) {
console.log(key)
}
也可以使用 Reflect.ownKeys(obj) 获取所有属性包括Symbol
for (const key of Reflect.ownKeys(obj)) {
console.log(key)
}
如果对象属性不想被遍历,可以使用Symbol保护