mortal-cultivation-biography / daydayup

A FE interview-questions collection repo.
8 stars 0 forks source link

Symbol 的定义和作用 #42

Open nmsn opened 1 year ago

nmsn commented 1 year ago

如题

nmsn commented 1 year ago

定义

Symbol 是 ES6 新出的一种基础数据类型, 使用 Symbol([description]) 而不是 new Symbol([description]) 来生成唯一的 symbol 值。一个 symbol 值能作为对象属性的标识符;这是该数据类型仅有的目的。

特点

  1. 就算传入相同的描述字段也生成的是不同的 symbol
Symbol("foo") === Symbol("foo"); // false
  1. Symbol 类型的 key 是不能通过 Object.keys() 或者 for...in 来枚举的,同样 JSON.stringify() 也会忽略 Symbol 类型的字段

使用场景

给对象定义 symbol 类型的属性

let obj = {
  abc: 123,
  "hello": "world"
}

obj["abc"] // 123
obj["hello"] // 'world'
而现在,Symbol可同样用于对象属性的定义和访问:

const PROP_NAME = Symbol()
const PROP_AGE = Symbol()

let obj = {
  [PROP_NAME]: "一斤代码"
}
obj[PROP_AGE] = 18

obj[PROP_NAME] // '一斤代码'
obj[PROP_AGE] // 18

获取 Symbol 类型的方法

// 使用Object的API
Object.getOwnPropertySymbols(obj) // [Symbol(name)]

// 使用新增的反射API
Reflect.ownKeys(obj) // [Symbol(name), 'age', 'title']

来源:https://juejin.cn/post/7028830157230047263