Symbol

Symbol類型

Symbol新的原始數據類型 (符號)表示獨一無二的值this

對象的key能夠使用Symbolcode

具備靜態屬性和靜態方法 不支持 new Symbol()對象

解決不一樣文件使用公共變量,互相影響,字符串

//shared.js ==================================
const cache = {}

//a.js ======================================
//cache['a_foo']  || cache['b_foo'] 之前的作法,約定好不一樣文件下的key,可是本質上並無解決問題只是規避了問題
cache['foo'] = "VLAUE"  

//b.js ========================================
cache['foo'] = "VALUE1111"
const s = Symbol()
console.log(s); //Symbol()
console.log(typeof s); //symbol
console.log(Symbol() === Symbol(),Symbol("aa") === Symbol("aa")); //false false
console.log(Symbol("aa"),Symbol("bb")) //描述文本 Symbol(aa) Symbol(bb)

能夠添加爲屬性名get

const obj1 = {
  [Symbol()]:123
}
console.log(obj1);

案例string

//建立私有變量
const name = Symbol()
const person = {
  [name]:"zxa",
  say(){
    console.log(this[name]);
  }
}

//b.js
// person[Symbol()] //沒法建立徹底相同的Symbol,取不到成員
person.say() //能夠拿到普通成員

靜態方法console

const s1 = Symbol.for() //內部維護了一個全局的註冊表,爲添加的標識字符串和Symbol值提供一一對應,下次再搜所給定key反現有symbol會返回不會新建立
const s2 = Symbol.for()
console.log(s1 === s2); //true 若是添加描述字符串,則添加的描述字符串必須一致才true
 
console.log(Symbol.for(true) === Symbol.for("true")); //true 會轉化成字符串

注意Symbol做爲key取不到變量

console.log(cache); //{ foo: 'VALUE1111', [Symbol()]: 100, [Symbol()]: 200 }

for (var key in cache){
  console.log(key); //拿不到Symbol的key         foo
}
console.log(Object.keys(cache)) // [ 'foo' ]
console.log(JSON.stringify(cache)); // {"foo":"VALUE1111"}
//單獨取Symbol()的方法
console.log(Object.getOwnPropertySymbols(cache)); //[ Symbol(), Symbol() ]
相關文章
相關標籤/搜索