Symbol在平时不常用,只不过是不熟悉它的用法,读了本文之后就会有使用的印象,利用起它的唯一性作用。
1. 唯一性
它是js的第7种数据类型,不需要用new操作符,否则会报错。
2. 数据类型的修饰
Symbol('a'),字符串a表示一种修饰,对你当前创建的Symbol类型的一种修饰,作为区分使用,否则当创建多个Symbol数据时,容易混淆。
3. 与其他数据类型之间的转换
Symbol不能用四则运算符进行操作,否则报错。它只能用显示的方式转为字符串和布尔值,即String(Symbol()) / Boolean(Symbol())
4. 作为对象的属性
三种方式来写:
let s = Symbol()
第1种
let person = {
[s]: 'haha'
}
第2种
let person = {}
person[s] = 'haha'
第3种
let 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。
使用场所
- 需要确定唯一性的时候
- 防止变量覆盖的时候