Symbol类型
Symbol(符号)是ECMAScript6新增的数据类型。符号是原始值,且符号实例是唯一、不可变的。符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险
声明定义Symbol的几种方式
let sym = Symbol()
let sym1 = Symbol()
console.log(sym == sym1) // false
let sym2 = Symbol('可以传入字符串参数作为符号的描述')
console.log(sym2.description) // 可以传入字符串参数作为符号的描述
console.log(sym2) // Symbol(可以传入字符串参数作为符号的描述)
console.log(sym2.toString()) // Symbol(可以传入字符串参数作为符号的描述)
let sym = Symbol.for('全局注册')
let sym1 = Symbol.for('全局注册')
console.log(sym == sym1) // true
console.log(Symbol.keyFor(sym)) // 全局注册
console.log(Symbol.keyFor(sym1)) // 全局注册
使用Symbol解决字符串耦合问题
在对象中如果key名重复,后面的key会把前面的key覆盖,使用Symbol类型定义唯一值,解决覆盖问题
let user1 = {
name: 'lisi',
key: Symbol(),
}
let user2 = {
name: 'lisi',
key: Symbol(),
}
let grade = {
[user1.key]: { js: 90, css: 100 },
[user2.key]: { js: 20, css: 40 },
}
console.log(grade) // Symbol(): {js: 90, css: 100}
// Symbol(): {js: 20, css: 40}
console.log(grade[user2.key]) // { js: 20, css: 40 }
Symbol在缓存器中的使用
class Cache {
static data = {}
static set(name, value) {
this.data[name] = value
}
static get(name) {
return this.data[name]
}
}
let user = {
name: 'apple',
key: Symbol(),
}
let cart = {
name: 'apple',
key: Symbol(),
}
Cache.set(user.key, user)
Cache.set(cart.key, cart)
console.log(Cache.get(user.key))
扩展特性与对象属性保护
使用Symbol定义key不会被for..in和for..of遍历到,通过for ..of Reflect.ownKeys()可以遍历到对象里面的Symbol属性
let sym = Symbol('这是一个Symbol类型')
let hd = {
name: 'doudun',
[sym]: 'doudounnnn',
}
for (const key in hd) {
console.log(key) // name
}
for (const key of Object.getOwnPropertySymbols(hd)) {
console.log(key) // Symbol(这是一个Symbol类型)
}
for (const key of Reflect.ownKeys(hd)) {
console.log(key) // name Symbol(这是一个Symbol类型)
}