介绍Symbol的特性及用法

424 阅读2分钟

Symbol在平时不常用,只不过是不熟悉它的用法,读了本文之后就会有使用的印象,利用起它的唯一性作用。

1. 唯一性

它是js的第7种数据类型,不需要用new操作符,否则会报错。

2. 数据类型的修饰

Symbol('a'),字符串a表示一种修饰,对你当前创建的Symbol类型的一种修饰,作为区分使用,否则当创建多个Symbol数据时,容易混淆。

3. 与其他数据类型之间的转换

Symbol不能用四则运算符进行操作,否则报错。它只能用显示的方式转为字符串和布尔值,即String(Symbol()) / Boolean(Symbol())

4. 作为对象的属性

三种方式来写:

let s = Symbol()

第1let person = {
    [s]: 'haha'
}

第2let person = {}
person[s] = 'haha'3let person = {}
Object.defineProperty(person, s, {value: 'haha'})

对象属性的遍历

Reflect.OwnKeys() 可遍历出Symbol类型,所以以后遍历对象,这个最保险

Object.getOwnPropertySymbols(person)单独遍历出Symbol类型

let s = Symbol()
let person = {
    age: 12,
    name: 'hhy',
    [s]: 'haha'
}
for(var i in person){
    console.log(i) //age name
}

for(var i of person){
    console.log(i) //报错,Symbol并不具备迭代器接口
}
Object.keys(person)  //age name 
Object.getOwnPropertySymbols(person) //Symbol(s) 
Object.OwnKeys(person) //age name  Symbol(s)
Object.getOwnPropertyNames(person) //age name 

5. Symbol.for 和 Symbol.keyFor

let s1 = Symbol.for('foo')
let s2 = Symbol.for('foo')
console.log(s1 === s2) //true

Symbol.keyFor(s1) //foo

let s3 = Symbol('foo')
Symbol.keyFor(s3) //undefined
  • Symbol.for和Symbol创建的都是Symbol类型,但是他们的创建机制有所不同。
  • Symbol.for('foo')的创建方式在创建之前在全局中寻找,有没有用Symbol.for的方式,并且key是'foo'的字符串创建了Symbol类型,创建了就会在全局中登记,如果有则不重复创建,直接用已创建的,否则创建。
  • Symbol('foo')的创建方式不会在全局中寻找,是直接创建新的。
  • Symbol.keyFor(s1)是返回一个已登记的Symbol类型值的key。

使用场所

  1. 需要确定唯一性的时候
  2. 防止变量覆盖的时候