天天看點

Symbol - 聽說用了這個方法就能建立出相同的Symbol值

前言

小夥伴們大家好。上一篇文章我們分享了ES6中新增基本資料類型Symbol的用法及特點。通過上一篇的學習我們知道:用Symbol方法建立出來的Symbol值都是獨一無二的,即使傳遞了一模一樣的參數,那麼如果有時候我就是想要建立一個相同的Symbol有沒有辦法呢,答案是肯定的。接下來将給大家分享一個能夠建立相同Symbol值的方法。

Symbol的方法

  • Symbol.for()

有時候我們就是希望傳遞相同的參數就能夠建立出相同的Symbol值來使用。Symbol為我們提供了一個方法:Symbol.for(),它接收一個字元串作為參數(可選),然後會在全局中搜尋有沒有以該參數作為描述的Symbol值,如果有則直接傳回該Symbol,否則将以該參數作為描述建立一個新的Symbol值,并将其注冊的全局環境供搜尋,用Symbol方法建立的Symbol值是不會注冊到全局的。

也就是說在使用Symbol.for()建立Symbol值時,首先會到全局環境中檢測有沒有建立,有就直接傳回,沒有再去建立新值,而Symbol則不管有沒有都是建立新值。

另外:Symbol.for()在建立Symbol值時是登記在全局環境中的,不管有沒有在全局環境運作

let s1 = Symbol.for('Yannis');
let s2 = Symbol.for('Yannis');
console.log(s1 === s2); // true

let s3 = Symbol('Yannis');
let s4 = Symbol('Yannis');
console.log(s3 === s4); // false

// 不管在哪裡調用,都會被注冊登記到全局環境
function foo() {
  return Symbol.for('Yannis');
}
const x = foo();
const y = Symbol.for('Yannis');
console.log(x === y); // true
           

上面的代碼中,s1、s2、s3、s4都是Symbol值,并且它們的描述也都是一樣的,但是用Symbol.for()建立出來的s1和s2實際上是同一值,而用Symbol方法生成的則是完全不同的值。

Symbol.for()與Symbol()這兩種寫法都能夠生成新的 Symbol值。但它們的差別是,前者會被登記在全局環境中供搜尋,而後者不會。Symbol.for()不會每次都去建立一個新的 Symbol 值,而是先檢查全局環境中是否已經存在,如果不存在才會建立新值。比如,用Symbol.for(“Yannis”)不管調用多少次,最後隻有一個Symbol值,而如果換成Symbol(‘Yannis’),那麼調用多少次就會生成多少個新的Symbol值,比如調用100次那就是100個全新的Symbol值。

  • Symbol.keyfor()
Symbol還為我們提供了一個keyfor方法,這個方法需要與Symbol.for方法配合使用,因為它是用來擷取一個被登記過的Symbol值的key,就是建立Symbol值時的那個字元串描述。
  • keyfor方法接收一個Symbol類型的參數,用于傳回該Symbol的key
  • keyfor方法隻能傳回被登記過的Symbol值的key,也就是說隻有通過Symbol.for方法建立的Symbol值的key才會被傳回
let s1 = Symbol.for("Yannis");
Symbol.keyFor(s1) // "Yannis"

let s2 = Symbol("Yannis");
Symbol.keyFor(s2) // undefined
           
上面代碼中,通過 Symbol.for(“Yannis”)建立的Symbol值的key “Yannis”被傳回了,而用Symbol生成的值傳回的确實Undefined。這也進一步印證了keyfor是傳回被登記過的Symbol值的key的。

總結

本章我們又掌握了一個新姿勢,原來Symbol的值也是可以相同的,關鍵在于用什麼方法去建立。關于Symbol的兩個方法就分享到這裡了。

喜歡的小夥伴歡迎點贊留言加關注哦!

繼續閱讀