JavaScript中的Set和Map數據結構總結

Set:

基礎用法

  • Set類似於數組,但是成員的值都是唯一的,沒有重複的值。Set本身爲構造函數,用它來生成Set數據結構。
  • const set = new Set();  // Set 函數可以接受一個數組(或者具有 iterable 接口的其他數據結構)作爲參數,用來初始化。

Set 實例的屬性和方法

Set 結構的實例有以下屬性。

  • Set.prototype.constructor:構造函數,默認就是Set函數。
  • Set.prototype.size:返回Set實例的成員總數。

Set 實例的方法分爲兩大類:操作方法(用於操作數據)和遍歷方法(用於遍歷成員)。下面先介紹四個操作方法。

  • add(value):添加某個值,返回 Set 結構本身。
  • delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。
  • has(value):返回一個布爾值,表示該值是否爲Set的成員。
  • clear():清除所有成員,沒有返回值。

遍歷操作

Set 結構的實例有四個遍歷方法,可以用於遍歷成員。

  • keys():返回鍵名的遍歷器
  • values():返回鍵值的遍歷器
  • entries():返回鍵值對的遍歷器
  • forEach():使用回調函數遍歷每個成員

注意事項

  • 向 Set 加入值的時候,不會發生類型轉換,所以0"0"是兩個不同的值。Set 內部判斷兩個值是否不同,使用的算法叫做“Same-value-zero equality”,它類似於精確相等運算符(===),主要的區別是NaN等於自身,而精確相等運算符認爲NaN不等於自身。
  • Set的遍歷順序就是插入順序。這個特性有時非常有用,比如使用 Set 保存一個回調函數列表,調用時就能保證按照添加順序調用。

WeakSet:

含義

WeakSet 結構與 Set 類似,也是不重複的值的集合。但是,它與 Set 有兩個區別。

  • WeakSet 的成員只能是對象,而不能是其他類型的值。
  • WeakSet 中的對象都是弱引用,即垃圾回收機制不考慮 WeakSet 對該對象的引用,也就是說,如果其他對象都不再引用該對象,那麼垃圾回收機制會自動回收該對象所佔用的內存,不考慮該對象還存在於 WeakSet 之中。

語法

  • WeakSet 是一個構造函數,可以使用new命令,創建 WeakSet 數據結構。
  • const w = new WeakSet();  // WeakSet 可以接受一個數組或類似數組的對象作爲參數。(實際上,任何具有 Iterable 接口的對象,都可以作爲 WeakSet 的參數。)該數組的所有成員,都會自動成爲 WeakSet 實例對象的成員。

WeakSet 結構有以下三個方法。

  • WeakSet.prototype.add(value):向 WeakSet 實例添加一個新成員。
  • WeakSet.prototype.delete(value):清除 WeakSet 實例的指定成員。
  • WeakSet.prototype.has(value):返回一個布爾值,表示某個值是否在 WeakSet 實例之中。

Map:

含義和基本用法

JavaScript 的對象(Object),本質上是鍵值對的集合(Hash 結構),但是傳統上只能用字符串當作鍵。這給它的使用帶來了很大的限制。爲了解決這個問題,ES6 提供了 Map 數據結構。它類似於對象,也是鍵值對的集合,但是“鍵”的範圍不限於字符串,各種類型的值(包括對象)都可以當作鍵。也就是說,Object 結構提供了“字符串—值”的對應,Map 結構提供了“值—值”的對應,是一種更完善的 Hash 結構實現。如果你需要“鍵值對”的數據結構,Map 比 Object 更合適。

const map = new Map();  // 數組(數組的成員是一個個表示鍵值對的數組)及任何具有 Iterator 接口、且每個成員都是一個雙元素的數組的數據結構都可以當作Map構造函數的參數。

實例的屬性和操作方法

Map 結構的實例有以下屬性和操作方法。

(1)size 屬性

size屬性返回 Map 結構的成員總數。

(2)set(key, value)

set方法設置鍵名key對應的鍵值爲value,然後返回整個 Map 結構。如果key已經有值,則鍵值會被更新,否則就新生成該鍵。

set方法返回的是當前的Map對象,因此可以採用鏈式寫法。

(3)get(key)

get方法讀取key對應的鍵值,如果找不到key,返回undefined

(4)has(key)

has方法返回一個布爾值,表示某個鍵是否在當前 Map 對象之中。

(5)delete(key)

delete方法刪除某個鍵,返回true。如果刪除失敗,返回false

(6)clear()

clear方法清除所有成員,沒有返回值。

遍歷方法

Map 結構原生提供三個遍歷器生成函數和一個遍歷方法。

  • keys():返回鍵名的遍歷器。
  • values():返回鍵值的遍歷器。
  • entries():返回所有成員的遍歷器。
  • forEach():遍歷 Map 的所有成員。

WeakMap:

含義

WeakMap結構與Map結構類似,也是用於生成鍵值對的集合。

WeakMapMap的區別有兩點。

  • WeakMap只接受對象作爲鍵名(null除外),不接受其他類型的值作爲鍵名。
  • WeakMap的鍵名所指向的對象,不計入垃圾回收機制。它的鍵名所引用的對象都是弱引用,即垃圾回收機制不將該引用考慮在內。因此,只要所引用的對象的其他引用都被清除,垃圾回收機制就會釋放該對象所佔用的內存。也就是說,一旦不再需要,WeakMap 裏面的鍵名對象和所對應的鍵值對會自動消失,不用手動刪除引用。

WeakMap只有四個方法可用:get()set()has()delete()

與其他數據結構的互相轉換

(1)Map 轉爲數組

前面已經提過,Map 轉爲數組最方便的方法,就是使用擴展運算符(...)。

(2)數組 轉爲 Map

將數組傳入 Map 構造函數,就可以轉爲 Map。

(3)Map 轉爲對象

如果所有 Map 的鍵都是字符串,它可以無損地轉爲對象。

如果有非字符串的鍵名,那麼這個鍵名會被轉成字符串,再作爲對象的鍵名。

(4)對象轉爲 Map

通常需要遍歷對象再調用Map的set方法。

(5)Map 轉爲 JSON

Map 轉爲 JSON 要區分兩種情況。一種情況是,Map 的鍵名都是字符串,這時可以選擇轉爲對象 JSON。

另一種情況是,Map 的鍵名有非字符串,這時可以選擇轉爲數組 JSON。

(6)JSON 轉爲 Map

JSON 轉爲 Map,正常情況下,所有鍵名都是字符串。

但是,有一種特殊情況,整個 JSON 就是一個數組,且每個數組成員本身,又是一個有兩個成員的數組。這時,它可以一一對應地轉爲 Map。這往往是 Map 轉爲數組 JSON 的逆操作。

 

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