基本含義
Map 對象
保存鍵值對,與 objects 對象
最大的區別是:能夠記住原始插入順序;並可以直接統計總數量;且任何值(對象/原始值)都能作爲一個鍵或一個值。
鍵相等
NaN 是與 NaN 相等的(雖然 NaN !== NaN),剩下所有其它的值是根據 === 運算符的結果判斷是否相等。
(可以理解爲直接用 ===
作爲判斷依據)
Objects 和 maps 的比較
objects | maps | |
---|---|---|
鍵 | 字符串/Symbol | 任意值(函數、對象、基本類型) |
遍歷是否按插入順序返回鍵值 | 是 | 否 |
獲取鍵值對個數 | 手動運算 | .size 返回 |
是否可迭代 | 必須先獲取鍵 | 可直接迭代 |
頻繁增刪鍵值對 | 差 | 有優勢 |
屬性
size
size 屬性的值是一個整數,表示 Map 對象有多少個鍵值對。size 是 只讀 屬性,用set 方法修改size返回 undefined,即不能改變它的值。
代碼演示:
let myMap = new Map();
myMap.set("a", "aaa");
myMap.set("b", "bbb");
console.log(myMap.size); // 2
has
方法has() 返回一個bool值,用來表明map 中是否存在指定元素.
var myMap = new Map();
myMap.set("test", "value");
myMap.has("test"); // returns true
myMap.has("ceshi"); // returns false
myMap.has("value"); // returns false
get
get()
方法返回某個 Map 對象中的一個指定元素。
myMap.get(key);
key: 必須參數,也是它唯一的參數
返回一個 Map 對象中與指定鍵相關聯的值,如果找不到這個鍵則返回 undefined
。
let myMap = new Map();
myMap.set("test", "hhh");
myMap.get("test"); // 返回 "hhh"
myMap.get("ceshi"); // 返回 undefined
set
set()
方法爲 Map 對象 添加. 或 更新 一個指定了鍵(key)和值(value)的(新)鍵值對。
let myMap = new Map();
// 將一個新元素添加到 Map 對象
myMap.set("test", "hhh");
myMap.set(1, "one");
// 在Map對象中更新某個元素的值
myMap.set("test", "test");
// 鏈式設置更新某個元素的值
myMap.set('test', 'hhh')
.set(1, '111')
.set(2, '222');
keys
keys()
返回一個新的 Iterator
對象。它包含按照順序插入 Map 對象中每個元素的key值。
var myMap = new Map();
myMap.set("0", "000");
myMap.set(1, 111);
myMap.set({}, "222");
var mapIter = myMap.keys();
console.log(mapIter.next().value); // "0"
console.log(mapIter.next().value); // 1
console.log(mapIter.next().value); // Object
values
values()
方法返回一個新的Iterator對象。它包含按順序插入Map對象中每個元素的value值。
var myMap = new Map();
myMap.set("0", "000");
myMap.set(1, 111);
myMap.set({}, "222");
var mapIter = myMap.keys();
console.log(mapIter.next().value); // "000"
console.log(mapIter.next().value); // 111
console.log(mapIter.next().value); // "222"
entries
entries()
方法返回一個新的包含 [key, value] 對的 Iterator 對象,返回的迭代器的迭代順序與 Map 對象的插入順序相同。
var myMap = new Map();
myMap.set("0", "test");
myMap.set(1, "ceshi");
var mapIter = myMap.entries();
console.log(mapIter.next().value); // ["0", "test"]
console.log(mapIter.next().key); // undefined
clear
clear()
方法會移除Map對象中的所有元素。
let myMap = new Map();
myMap.set("test", "1");
myMap.set(1, "2");
myMap.size; // 2
myMap.has("test"); // true
myMap.clear();
myMap.size; // 0
myMap.has("test") // false
delete
delete()
方法用於移除 Map 對象中指定的元素。- 參數:從 Map 對象中移除的元素的鍵。
- 返回值:如果 Map 對象中存在該元素,則移除它並返回 true;否則如果該元素不存在則返回 false。
let myMap = new Map();
myMap.set("test", "1");
myMap.delete("test"); // 返回 true。成功地移除元素
myMap.has("test"); // 返回 false。"test" 元素將不再存在於 Map 實例中
forEach
- forEach() 方法將會以插入順序對 Map 對象中的每一個鍵值對執行一次參數中提供的回調函數。
function logMapElements(value, key, map) {
console.log("m[" + key + "] = " + value);
}
Map([["test", 3], ["shiyan", {}], ["ceshi", undefined]]).forEach(logMapElements);
// logs:
// "m[test] = 3"
// "m[shiyan] = [object Object]"
// "m[ceshi] = undefined"
代碼
使用 for…of 方法迭代 Map
Map 與數組的關係
複製或合併 Maps
-
像數組一樣合併
let original = new Map([ [1, 'one'] ]); let clone = new Map(original); console.log(clone.get(1)); // one console.log(original === clone); // false. 淺比較 不爲同一個對象的引用
-
Map對象間可以進行合併,但是會保持鍵的唯一性
let first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); let second = new Map([ [1, 'uno'], [2, 'dos'] ]); // 合併兩個Map對象時,如果有重複的鍵值,則後面的會覆蓋前面的。 // 展開運算符本質上是將Map對象轉換成數組。 let merged = new Map([...first, ...second]); console.log(merged.get(1)); // uno console.log(merged.get(2)); // dos console.log(merged.get(3)); // three
-
Map對象也能與數組合並
let first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); let second = new Map([ [1, '1'], [2, '2'] ]); // Map對象同數組進行合併時,如果有重複的鍵值,則後面的會覆蓋前面的。 let merged = new Map([...first, ...second, [1, '3']]); console.log(merged.get(1)); // 3 console.log(merged.get(2)); // '2' console.log(merged.get(3)); // 'three'
參考鏈接
[1] MDN Map
[2] MDN Map.prototype.size