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保护

贡献者: mankueng