1. 程式人生 > 程式設計 >js的Map函式使用方法詳解

js的Map函式使用方法詳解

Map是ES2015引入的Global Object,
Map物件中儲存了鍵值對,且任何物件(包括原始值)都可以作為鍵或者值。

1. 建構函式

Map必須作為建構函式來使用,

new Map([iterable])

它的引數是可選的,如果提供的話,必須是一個iterable物件。
iterable物件的迭代結果為,[key1,value1],[key2,value2],...

例如

// 1. 陣列是一個iterable物件
m = new Map([[1,'a'],[2,'b']]);    // Map(2) {1 => "a",2 => "b"}

// 2. generator會返回一個iterable物件
gen = function*(){
  yield [1,'a'];
  yield [2,'b'];
}
iter = gen();
m = new Map(iter);    // Map(2) {1 => "a",2 => "b"}

2. 例項屬性

m.size用來獲取key的個數,

m = new Map([[1,[2,2 => "b"}
m.size    // 2

3. 例項方法

(1)m.has(key),判斷key是否存在
(2)m.get(key),取值,如果沒有這個key就返回undefined(3)m.set(key,value),設值,返回m(4)m.delete(key),如果key存在且已經被刪除了就返回true,如果key不存在就返回false。
(5)m.clear(),刪除所有鍵值對

(6)m.keys(),返回一個iterable物件,其中包含了按插入順序迭代的所有key

m = new Map([[1,'b']]);    // Map(www.cppcns.com
2) {1 => "a",2 => "b"} [...m.keys()] // [1,2]

(7)m.values(),返回一個iterable物件,其中包含了按插入順序迭代的所有value

m = new Map([[1,2 => "b"}
[...m.values()]    // ["a","b"]

(8)m.entries(),返回一個iterable物件,每一個元素是[key,value],遍歷順序按key的插入順序

m = new Map([[1,2 => "b"}
[...m.entries()]    // [[1,"a"],"b"]]

注:更便捷的得到二維陣列的方法是使用Array.from,它可以直接接受Map

作為引數,

m = new Map([[1,2 => "b"}
Array.from(m)    // [[1,"b"]]

Array.from也可以接受iterable物件,

Array.from(m.keys())    // [1,2]
Array.from(m.values())    // ["a","b"]
Array.from(m.entries())    // [[1,"b"]]

(9)m.forEa客棧ch(fn[,thisArg]),用於對Map以key的插入順序進行遍歷

m = new Map([[1,2 => "b"}
m.forEach((value,key)=>{
    value    // "a","b"
    key      // 1,2
});

注:第一個引數是value,第二個引數才是key。

http://www.cppcns.com了使用m.forEachMap還可以使用for ... of進行遍歷,

m = new Map([[1,'b']]);
for(i of m){
  i    // [1,'b']
}

4. key的相等性判斷

Map key的相等性判斷,使用了所謂的“SameValueZero”演算法:
(1)在做key的相等性判斷時,NaN被認為與NaN相等。(即使NaN !== NaN
(2)其他種類的key,依據===運算子進行判斷。
(3)目前+0-0被認為相等是符合ES2015規範的,但是會有瀏覽器相容性問題。

5. Map與Object對比

(1)Object的key只能是字串(String)或符號(Symbol),
Map的key可以是任意值,包括函式,物件(object)或者任何原始值(primitive value)。

(2)對於Map來說,可以通過size屬性直接獲取key的個數,
Object則需要Object.keys(xxx).length來間接獲取自身屬性的個數。

(3)Map例項是一個iterable物件,可以直接用來OopGiRj遍歷,
Object需要先獲取它的key,再使用key進行遍歷。

(4)Object可以有原型物件,自身屬性可能會無意間與原型屬性相沖突。
(雖然ES2015中可以通過Object.create(null)來建立一個無原型的物件。)

(5)Map key的新增刪除操作更加高效。

更多關於中的Map函式使用方法請檢視下面的相關連結