ES6學習:Map結構的目的和基本用法


Map結構的目的和基本用法

JavaScript的對象(Object)本質上是鍵值對的集合(Hash結構),但是只能用字符串作為鍵。這給它的使用帶來了很大的限制。

上面的代碼原意是將一個DOM節點作為對象data的鍵,但是由於對象只接受字符串作為鍵名,所以element被自動轉化為字符串[Object HTMLdivElement]。

為解決這個問題,ES6提供了Map數據結構。它類似於對象,也是鍵值對的集合,但是“鍵”的范圍不限於字符串,各種類型的值(包括對象)都可以當作鍵。也就是說,Object結構提供了“字符串-值”的對應,Map結構提供了“值-值”的對應,是一種更完善的Hash結構實現。如果你需要“鍵值對”的數據結構,Map比Object更適合。

上面的代碼使用set方法將對象o當作m的一個鍵,然后又實用get方法讀取這個鍵,最后使用delet方法刪除了這個鍵。

作為構造函數,Map也可以接受一個數組作為參數。該數組的成員是一個個表示鍵值對的數組。

上面的代碼在新建Map實例時就制定了兩個鍵-name和title。

Map構造函數接受數組作為參數,實際上執行的是下面的算法。

如果對同一個鍵多次賦值,后面的值將覆蓋前面的值。

上面的代碼對鍵1連續賦值兩次,后一次的值覆蓋了前一次的值。
如果讀取一個未知的鍵,則返回undefined。

注意,只有對同一個對象的應用,Map結構才將其視為同一個鍵。這一點要非常小心。

上面的set和get 方法,表面上是針對同一個鍵,但實際上是兩個值,內存地址是不一樣的,因此get方法無法讀取該鍵,返回undefined。

同理,同樣的值的兩個實例,在Map結構中被視為兩個鍵。

上面的代碼中,變量k1和k2的值是一樣的,但他們在Map結構中被視為兩個鍵。

由上可知,Map的鍵實際上是跟內存地址綁定的,只要內存地址不一樣,就視為兩個鍵。這就解決了同名屬性碰撞(clash)的問題,我們擴展別人的庫時,如果使用對象作為鍵名,不用擔心自己的屬性與原作者的屬性同名。

如果Map的鍵是一個簡單的值(數字、字符串、布爾值),則只要兩個值嚴格相等,Map就將其視為一個鍵,包括0和-0.另外,雖然NaN不嚴格對於自身,但Map將其視為同一個鍵。

 

實例的屬性和操作方法

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

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

set(key,value)方法

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

set 方法返回的是Map本身,因此可以采用鏈式寫法。

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

has( key ):has方法返回一個布爾值,表示某個鍵是否在Map數據結構中。

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

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

遍歷方法:

Map原生提供3個遍歷器生成函數和1個遍歷方法。

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

下面是使用實例。

以上最后的那個例子,表示Map結構的默認遍歷器接口(Symbol.iterator屬性)就是entries方法。

Map結構轉為數組結構比較快速的方法是結合使用擴展運算符(…)。

結合數組的map方法,filter方法,可以實現Map的遍歷和過濾(Map本身沒有map 和filter方法)。

此外,Map還有一個forEach方法,與數組的forEach方法類似,也可以實現遍歷。

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

Map轉換為數組

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

數組轉為Map

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

Map轉為對象

如果Map的所有鍵都是字符串,則其可以轉為對象。

對象轉為Map


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM