讀書筆記:深入理解ES6 (七)

第7章 Set集合與Map集合

序:在ES5中,開發者們已經使用非數組對象實現了類似Set集合、Map集合的類似的功能。在ES6中,新標準將Set集合與Map集合添加到了JavaScript中。


第1節 ES5中的Set集合與Map集合
    
    在ES5中,開發者們經常用對象屬性來模擬這兩種組合。一般來說,Set集合常被用於檢查對象中是否存在某一個鍵名,而Map集合常被用於獲取已存的信息。


第2節 該解決方案的一些問題
    
    在第1節中提到的開發者經常使用的方法中,仍然會有一些限制。例如:當對象的屬性分別是數字5和字符串"5"時,二者取到的值是一樣的;當對象的屬性也是對象的時候,兩個都是對象的屬性的值會被設置爲一樣,等等。這說明,按原來的解決方案還是會有一些問題,並且在定位和調試問題方面也會有一定難度。


第3節 ES6中的Set集合
    
    1. 如何創建Set集合?

  調用 new Set() 即可。

    2. 調用 add() 方法:可以向集合中添加元素

    3. 訪問集合的 size 屬性可以獲取集合中目前的元素的數量。例如:

         let set = new Set();
             set.add(5);
             set.add("5");
         console.log( set.size ); //2


    4. 調用 has() 方法,可以判斷Set集合中是否存在某個值。例如:

 let set = new Set();
      set.add(5);
      set.add("5");
 
 console.log( set.has(5) ); //true
 console.log( set.has(6) ); //false


    5. 調用 delete() 方法,可以移除Set集合中的某一個元素

    6. 調用 clear() 方法,可以移除集合中的所有元素。舉例:

 let set = new Set();
      set.add(5);
      set.add("5");
      set.delete(5);
 console.log( set.has(5) ); //false
 
      set.clear();
 console.log( set.has("5") ); //false
 console.log( set.size ); //0


    7. 調用 forEach() 方法來迭代 Set 集合。
        forEach() 接收的三個參數爲:value / key / ownerSet(原來的Set集合)。舉例:

   let set = new Set( [1, 2] );
       set.forEach(function(value, key, ownerSet) {
            console.log( key + " " + value );
            console.log( ownerSet === Set );
       });
  
      //打印
      //1 1
      //true
     //2 2
     //true


    8. Set集合與數組互相轉換。
        1)將數組轉爲Set集合:給Set構造函數傳入數組即可;
        2)將Set轉爲數組:使用展開運算符。舉例:

  let set = new Set( [1,2,3,3,3,4,5] ),
      array = [...set];
  console.log( array ); //[1,2,3,4,5]


    9. Weak Set集合
        1)出現原因。
            只要Set集合實例中的引用存在,垃圾回收機制就不能釋放該對象的內存空間,於是之前提到的Set類型可以被看作是一個強引用。 Weak Set(弱引用Set集合)中的弱引用如果是對象的唯一引用,則會被回收並釋放相應內存。

        2)Weak Set創建、添加、判斷、刪除方法:

 let set = new WeakSet(),
      key = {};
             
      //向集合中添加對象
      set.add(key);
      console.log( set.has(key) ); // true
 
      set.delete(key);
      console.log(set.has(key)); //false


            注意:WeakSet構造函數不接受任何原始值,否則會拋出錯誤。

        3)Set、WeakSet區別:
            a) 在Weak Set實例中,向add()傳非對象參數,會報錯;向has()、delete()傳非對象參數,則會返回false。
            b) Weak Set集合不可以迭代,不能被用於for-of循環,不支持forEach()方法。
            c) Weak Set集合不暴露任何迭代器(keys()、values())。
            d) Weak Set集合不支持size屬性。

            注意:如果只需要跟蹤對象引用,更應該使用WeakSet集合,而不是Set集合。

第4節 ES6中的Map集合
    Map類型是一種存儲許多鍵值對的有序列表。可以通過set()方法向Map集合中添加新元素;通過get()方法從Map集合中獲取信息。在對象中,無法用對象作爲對象屬性的鍵名,但在Map集合中可以這樣做。

    1. Map集合支持的方法。
        ·has(key)      //檢測指定的鍵名是否存在
        ·delete(key)  //移除指定鍵名及對應值
        ·clear()         //移除Map所有鍵值對
        
    2. Map集合的初始化方法
        向Map構造函數傳入數組來初始化一個Map集合。數組中的每一個元素都是一個子數組,子數組中包含一個鍵值對的鍵名與值兩個元素。舉例:

 let map = new Map( [["name", "zxx"], ["age", "25"]] );
 
 console.log( map.has("name") ); // true
 console.log( map.get("name") ); // "zxx"
 console.log( map.has("age") ); // true
 console.log( map.get("age") ); // 25
 console.log( map.size ); // 2


    3. Map集合的forEach()方法。
        與Set類似,在此不再使用篇幅介紹。

    4. Weak Map集合
        ·Weak Map集合中的鍵名必須是一個對象,如果使用非對象鍵名會報錯。
       · Weak Map是無序列表。
        ·Weak Map不支持forEach()方法、size屬性及clear()方法。

 

(本節完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章