(一)Map
Map和weakmap它們本質(zhì)與對象一樣,都是鍵值對的集合,但是他們與Object對象主要的不同是,鍵可以是各種類型的數(shù)值,而若鍵是Object類型,那么只能是字符串類型或者Symbol類型值。Map和WeakMap是更為完善的Hash結(jié)構(gòu)。
1.對象和Map
//---------對象---------------------------
var keyObj = {};
var dataObj = {};
dataObj[keyObj] = "大腳好";
雖然表面上看dataObj對象的鍵是對象keyObj,其實(shí)不是,dataObj[keyObj]會將keyObj轉(zhuǎn)換轉(zhuǎn)為字符串"[object Object]"。
//----------Map----------------------------
var mapData = new Map();
var objKey = {p: "antzone"};
mapData.set(objKey, "對象鍵"); ???//添加新元素
console.log(mapData.get(objKey)); //獲取對應(yīng)key的value?
console.log(mapData.has(objKey)); ?//判斷是否含有
console.log(mapData.delete(objKey)); //刪除鍵值對
mapData.clear(); ???//清空
2.數(shù)組作為構(gòu)造函數(shù)參數(shù)
var mapData = new Map([
["webName", "資源庫"],
["url", "www.yuankuwang.com"]
]);
console.log(mapData.size);//2
console.log(mapData.has("webName"));//true
console.log(mapData.get("webName"));//資源庫
console.log(mapData.has("url"));//true
console.log(mapData.get("url"));//www.yuankuwang.com
構(gòu)造函數(shù)參數(shù)為數(shù)組執(zhí)行的是如下算法(數(shù)組的forEach方法)
forEach方法將會以插入順序?qū)ap對象中的每一個鍵值對執(zhí)行一次參數(shù)中提供的回調(diào)函數(shù)。
value:可選,元素的值。
key:可選,元素的鍵。
Map:可選,當(dāng)前的Map對象。
thisArg:可選,callback執(zhí)行時其this的值。 ?
mapData.forEach(function (value,key) {
??console.log(value,key);
})
var arr = [["webName", "資源庫"], ["url", "www.yuankuwang.com"]];
var mapData = new Map();
arr.forEach(([key, value]) => mapData.set(key, value));
3.由于Map對象的鍵可以是對象,所以只有對同一個對象的引用,Map對象才將其視為同一個鍵。
NaN不嚴(yán)格相等于自身,但Map將其視為同一個鍵
let mapData = new Map();
mapData.set(NaN, 5);
console.log(mapData.get(NaN));
mapData.set(-0, 5);
console.log(mapData.get(+0));
4.Map遍歷
//---------轉(zhuǎn)成數(shù)組-----------
var mapData = new Map([["webName", "資源庫"], ["url", "www.yuankuwang.com"]]);
var arr = [...mapData];
console.log(arr);
//---------for--of循環(huán)--------
var mapData = new Map([["webName", "資源庫"], ["url", "www.yuankuwang.com"]]);
for(let elem of mapData) {
??console.log(elem);
}
//----------其他函數(shù)-------------
var keyIterator = mapData.keys();//鍵遍歷器
console.log(keyIterator);
var valueIterator = mapData.values(); ?//值遍歷器
console.log(keyIterator.next()); ??//遍歷器用法
console.log(valueIterator);
var size = mapData.size; ?????//鍵值對數(shù)量
console.log(size);
(二)WeakMap
WeakMap結(jié)構(gòu)與Map結(jié)構(gòu)基本類似。
區(qū)別:是它只接受對象作為鍵名,不接受其他類型的值作為鍵名。鍵名是對象的弱引用,當(dāng)對象被回收后,WeakMap自動移除對應(yīng)的鍵值對,WeakMap結(jié)構(gòu)有助于防止內(nèi)存泄漏。
var wm = new WeakMap(); //只能放object的鍵
var obj = new Object();
wm.set(obj, '對象1');
// wm.delete(obj);
obj = null; //效果和delete的效果一樣
console.log(wm.get(obj)); //undefined
console.log(wm.has(obj)); //false ?
由于WeakMap對象不可遍歷,所以沒有size屬性。 ?