标签:声明 保护 esc rip desc ons 应用 魔术 sdn
Symbol:
一种新的原始数据类型,Symbol不是一个对象,不可以new
Symbol的声明方式:
const s1 = Symbol(‘s1‘) const s2 = Symbol(‘s1‘) console.log(typeof s1) console.log(s1 === s2) // false console.log(s1.description) // s1 console.log(Symbol.keyFor(s1)) //undefined
const s3 = Symbol.for(‘s3‘) const s4 = Symbol.for(‘s3‘) console.log(s3 === s4) // true console.log(s3.description) //s3 console.log(Symbol.keyFor(s3)) //s3
Symbol的应用场景:
// 把Symbol作为对象的key,可以保证当前的key不冲突 const stu1 = Symbol(‘zs‘) const stu2 = Symbol(‘zs‘) const student = { [stu1]: { class: 1, num: 2, major: ‘code‘}, [stu2]: { class: 1, num: 3, major: ‘code‘} } console.log(student[stu1]) // {class: 1, num: 2, major: "code"} console.log(student[stu2]) // {class: 1, num: 3, major: "code"}
//在一定程度上可以保护对象属性(感觉像是私有属性的亚子) const tel = Symbol(‘tel‘) class Student { constructor(name){ this.name = name this[tel] = ‘111‘ } getIfo(){ return this.name + this[tel] } } const s1 = new Student(‘zs‘) console.log(s1.getIfo()) // zs111 // 只能遍历不是Symbol的属性 for(let key in s1){ console.log(key) // name } // 只能遍历不是Symbol的属性 for(let key of Object.keys(s1)){ console.log(key) // name } // 只能遍历是Symbol的属性 for(let key of Object.getOwnPropertySymbols(s1)){ console.log(key) // Symbol(‘tel‘) } // 都可以 for(let key of Reflect.ownKeys(s1)){ console.log(key) // name Symbol(‘tel‘) }
消除魔术字符串:https://blog.csdn.net/ixygj197875/article/details/79165190
标签:声明 保护 esc rip desc ons 应用 魔术 sdn
原文地址:https://www.cnblogs.com/Momentt/p/13403081.html