Symbol("a")这种方式定义的Symbo永远不可能重复。
Symbol.for("a")这种方式定义的Symbol可能会重复,如果参数名相同则Symbol也相同。
let person = Symbol("小明") 这种普通方式定义的symbol不可能相同
let edu = Symbol("本科")
console.log(person == edu)
person.age = 20
console.log(person.age) //undefined
console.log(person.toString())
console.log(person.description)
let a = Symbol("cmshh")
let a2 = Symbol("cmshh") //创建了两个cmshh
let cms = Symbol.for("cmshh")
let cms2 = Symbol.for("cmshh") //相当于只创建了一个cmshh
let cms3 = Symbol("cmshh")
console.log(cms==cms2) //true Symbol.for("")定义的如果参数相同,则symbol也相同
console.log(Symbol.keyFor(cms)) //cmshh
console.log(Symbol.keyFor(cms3)) //undefined
Symbol.for()定义的会在全局中进行保存
使用加前缀方法避免被覆盖:
使用key:Symbol方式避免被覆盖:
class Cache{
static data = {}
static set(name,value){
return (this.data[name] = value)
}
static get(name){
return this.data[name]
}
}
let user = {
name:"apple",
desc:"用户资料",
key:Symbol('资料')
};
let cart = {
name:"apple",
desc:"购物车",
key:Symbol("购物车")
}
Cache.set(user.key,user)
Cache.set(cart.key,cart)
console.log(Cache.get(user.key))
console.log(Cache.get(cart.key))
Symbol类似于私有属性,是受保护的,用普通的for in、for of 遍历方式取不到Symbol的值。for in、for of只能遍历普通属性。
可以使用Objec.getOwnPropertySymbols()来遍历Symbol属性,这种方式只能遍历Symbol属性。
let symbol = Symbol("hhh")
let hd = {
name:"hello",
[symbol]:"baidu.com"
};
for(let key of Object.getOwnPropertySymbols(hd)){
console.log(key)
}
如果想遍历所有属性:
for(const key of Reflect.ownKeys(hd)){
console.log(key)
}
js对象的属性如果不希望公布到外部的话,可以使用Symbol把它隐藏起来:
let site = Symbol("this is a symbol")
class User{
constructor(name){
this.name = name
this[site] = "baidu"
}
getName(){
return `${this[site]} ${this.name}`;
}
}
let A = new User("A");
//console.log(A.getName())
for(const key in A){
console.log(key)
}