1.创建Symbol
1.1 Symbol()
let sym = Symbol('张三')
1.2 不能给Symbol创建属性,所以要访问内容就需要使用自带属性description
let sym = Symbol('张三')
console.log(sym.description) //张三
1.3也可以使用Symbol.for()的形式创建,
这个和Symbol()的不同在于用Symbol.for()创建时会查询内存中是否含有一样的Symbol对象,如果有就会直接把引用,就不会产生新的了
let sym2 = Symbol.for('李四')
1.4可以使用Symbol.keyFor()来查询描述,跟description一样,我更习惯直接用description
console.log(Symbol.keyFor(sym2)) //李四
2.Symbol的使用
2.1 解决字符串耦合问题
因为使用传统的对象方式,当属性名一样时就会覆盖掉相同属性名的,所以需要使用key来转为Symbol对象
let user1 = {
name: '张三',
key: Symbol('张三一号')
}
let user2 = {
name: '张三',
key: Symbol('张三二号')
}
let grader = {
[user1.key]: {
js: 100,
css: 10
},
[user2.key]: {
js: 10,
css: 100
}
}
console.log(grader)
2.2不能使用for in 或者for of 来遍历Symbol,单纯遍历出Symbol就使用
Object.getOwnPropertySymbols
let sym = Symbol('张三')
let obj = {
name: '我不叫张三',
[sym]: '我叫张三'
}
for (const key of Object.getOwnPropertySymbols(obj)) {
console.log(key)
}
2.3 如果需要遍历出所有就要使用 Reflect.ownKeys(obj)
let sym = Symbol('张三')
let obj = {
name: '我不叫张三',
[sym]: '我叫张三'
}
for (const key of Reflect.ownKeys(obj)) {
console.log(key)
}
2.4如果不想属性被暴露可以使用Symbol来保护
let site = Symbol('姓名')
class User {
constructor (name) {
this[site] = "张三"
this.name = name
}
getName () {
return `${this[site]}-${this.name}`
}
}
const zs = new User('我不是张三')
console.log(zs.getName()) //张三-我不是张三
for (const key in zs) {
console.log(key) //name
}