是時候複習ES6了 -- Symbol

前言

ES6之中新增了許多的的新的概念還使用方式,Symbol做爲新的基礎數據類型之一,咱們也須要重點的去理解學習。今天就然咱們來學習這一新的知識點吧數組

正文-Symbol

這是JS之中一種新的基本類型數據,數據類型就是Symbol,雖然相似於字符串,可是其表示的意思是獨一無二的意思。ES6引入這一類型的用意在於,經常咱們在命名的時候會有相同名稱衝突的問題,因此Symbol成爲咱們這個問題的直接方式。bash

  • 咱們能夠經過Symbol(String) 來獲取一個Symbol類型的變量,這裏不適用new的形式是應爲Symbol做爲基礎類型,不能視爲對象變量。因此就使用這一方式來獲取。其中能夠傳遞一個String類型的參數,表示對symbol實例的描述,同時也方便區分。固然咱們參數也能夠傳遞對象內容,可是會先自動的調用Object的toString方法轉化爲字符串,而後再生成symbol數據。
  • typeof在判斷全部的Symbol的值的時候返回類型將會是Symbol
  • symbol類型的數據,哪怕描述符是相同的,可是隻要是兩個變量的比對,永遠是false。
  • symbol的值不能夠和其餘類型的值作計算。可是其有toString的方法,能夠用來轉化成爲字符串。
  • Symbol.prototype.description:這個參數獲取的是當前symbol變量的描述符,即咱們傳遞如Symbol方法的那個字符串參數。
  • Symbol的變量能夠做爲對象內容,從而表示咱們的對象變量抿成的獨一無二,咱們再對象的擴展概念之中有說起到。對象的屬性的名稱可使用[name]的方式來進行肯定,name能夠是變量也能夠是表達式。因此咱們能夠使用Symbol的變量來做爲Object的屬性,這樣能夠徹底的防止對象屬性的重名的問題。可是咱們要注意的一點是,咱們使用Symbol做爲實行名稱的時候是不能經過點操做符來書寫的。
  • Symbol還能夠用於常量的控制,保證單個常量並不會與其餘的常量的值相同。
  • Symbol還能夠將與程序強耦合的字符串或者數字,脫離耦合,改爲更有語義化的程序代碼段。
  • Symbol做爲對象屬性的時候,再全部的遍歷方法之中都是沒有辦法獲取他的信息的。這個時候Object之中有一個getOwnPropertySymbols方法,能夠用來返回咱們對象之中全部的Symbol屬性組成的數組。可是咱們要注意的是Symbol屬性對然不容易遍歷到,可是它自己仍是共有屬性而不是私有的。可是咱們也能夠經過這個特性爲咱們的對象定義一些非私有可是隻在對象內部使用的方法。

接下來咱們來看一下Symbol爲咱們提供一些什麼屬性和方法吧:函數

  • Symbol.for(String):有的時候咱們但願使用同一個Symbol的值,這是後咱們能夠傳遞相關的Symbol描述符,若是方法比對到全局環境下有登記了的描述符相同的Symbol變量,則方法返回已有的Symbol變量,若是沒有將返回一個新的Symbol變量,且描述符是傳遞的參數。這一方法建立的對象內容會有登記再全局環境之中,可是咱們上面提到的Symbol()這個方法是不會登記的。
  • Symbol.forKey(Symbol):傳遞的symbol類型的值,返回的是當前值的說明符(key)。這裏的Symbol參數須要時登記了的變量,若是時沒有登記的變量將會返回undefined。
  • Symbol.hasInstance:這個屬性指向的時一個內部的方法,當咱們再使用instanceOf來作判斷的時候,實際上時再函數的內部調用了這個屬性對應的方法,因此咱們實際能夠重寫當前對象的InstanceOf的操做。看個例子
class MyClass {
      [Symbol.hasInstance](foo) {
        return foo instanceof Array;
      }
    }
    
    [1, 2, 3] instanceof new MyClass() // true
    可是再上面咱們能夠看到instanceof以後須要一個實例化的
    過程,可是咱們使用instanceof的時候每每想要直接使用類
    的名稱就行了,這是後咱們能夠吧這個方法寫成靜態的,以下:
    
    class Even {
      static [Symbol.hasInstance](obj) {
        return Number(obj) % 2 === 0;
      }
    }
    1 instanceof Even // false
    2 instanceof Even // true
複製代碼
  • Symbol.isConcatSpreadable : 咱們能夠從字面上看,is開頭的屬性每每都時布爾值類型的,concat再數組之中的經常出現用於合併內容的狀況,Spreadable中文意思表示可拆分。因此咱們能夠猜想一下,這個屬性時用於再合併方法中,當前對象是否能夠拆分的判斷。這個屬性的實際用途就是再concat函數之中才能體現,合併的時候數組對象默承認以展開,當設置這一屬性爲false的時候,合併的時候,數組將會以一個元素添加到新的合併數組之中。類數組對象則恰好相反,如默認狀況下不拆開,若是設置當前這一屬性時true的時候則拆開內容。咱們看個例子吧:
let arr1 = ['c', 'd'];
['a', 'b'].concat(arr1, 'e') // ['a', 'b', 'c', 'd', 'e']
arr1[Symbol.isConcatSpreadable] // undefined

let arr2 = ['c', 'd'];
arr2[Symbol.isConcatSpreadable] = false;
['a', 'b'].concat(arr2, 'e') // ['a', 'b', ['c','d'], 'e']

let obj = {length: 2, 0: 'c', 1: 'd'};
['a', 'b'].concat(obj, 'e') // ['a', 'b', obj, 'e']

obj[Symbol.isConcatSpreadable] = true;
['a', 'b'].concat(obj, 'e') // ['a', 'b', 'c', 'd', 'e']
複製代碼
  • Symbol.species 這一屬性指向的是一個函數,建立衍生對象的時候,會自動的調用。什麼是衍生對象就是經過對象的某一些方法,建立出來的新的,可是類型依舊是本來對象的類型,這一類對象咱們能夠程之爲衍生對象,例如:Array之中的map和filter方法,能夠說就是建立了衍生對象內容。而species這個指向的方法則使用與再衍生對象創造的時候返回的值。他須要是一個getter方法,返回的是當前的衍生對象的類型內容。上例子
class T1 extends Promise {
    }
    
    class T2 extends Promise {
      static get [Symbol.species]() {
        return Promise;
      }
    }
    
    new T1(r => r()).then(v => v) instanceof T1 // true
    new T2(r => r()).then(v => v) instanceof T2 // false
複製代碼
  • Symbol.match 這個屬性指向的是一個方法內容,咱們再調用String.prototype.match實際上就至關於調用了,RegExp[Symbol.match](this),這一調用返回值就是match方法最終結果。
  • Symbol.replace 這個屬性指代的也是一個方法,向上面的match同樣,它實際上就是String.prototype.replace方法調用的真實的返回值。
  • Symbol.search屬性,指向一個方法,該對象調用String.prototype.search方法的時候,會返回該方法的返回值。
  • Symbol.split屬性,指向一個方法,該對象被String.prototype.split方法調用時,會返回該方法的返回值。
  • Symbol.iterator屬性,指向該方法的默認遍歷器方法。
  • Symbol.toPrimitive屬性,指向一個方法。再該對象轉換成原始類型的值的時候,會調用這個方法,返回該對象原始類型的值。被調用的時候接受一個參數,代表當前運算的模式,一共是三種模式,Number轉換成數值類型,String轉換成字符串類型,Default轉換成數值或者字符串類型。
  • Symbol.toStringTag屬性,指向一個方法。主要是用於定製,當調用Object.prototype.toString()方法的時候,將當前函數返回的內容放在本來的[object Object]之中的第二個Object上面。
  • Symbol.unscopables屬性,指向一個方法,該對象指定了使用with關鍵字時,哪些屬性會被with環境排除。因爲with關鍵字不經常使用,因此咱們的對於這一屬性的使用至關稀少,我這裏就再也不多說,你們想要了解清楚的能夠自行的到官網上面進行學習。

結束

Symbol是一個比較關鍵的內容,因此這裏囉嗦了一些,概念型的東西老是複雜的。若是有什麼錯誤的地方望幫個忙,指出一下。但願共同進步,共同成長。拜了個拜。學習

相關文章
相關標籤/搜索