(一)Map
Map和weakmap它们本质与对象一样,都是键值对的集合,但是他们与Object对象主要的不同是,键可以是各种类型的数值,而若键是Object类型,那么只能是字符串类型或者Symbol类型值。Map和WeakMap是更为完善的Hash结构。
1.对象和Map
//---------对象--------------------------- var keyObj = {}; var dataObj = {}; dataObj[keyObj] = "大脚好"; 复制代码
虽然表面上看dataObj对象的键是对象keyObj,其实不是,dataObj[keyObj]会将keyObj转换转为字符串"[object Object]"。
//----------Map---------------------------- var mapData = new Map(); var objKey = {p: "antzone"}; mapData.set(objKey, "对象键"); //添加新元素 console.log(mapData.get(objKey)); //获取对应key的value console.log(mapData.has(objKey)); //判断是否含有 console.log(mapData.delete(objKey)); //删除键值对 mapData.clear(); //清空 复制代码
2.数组作为构造函数参数
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 复制代码
构造函数参数为数组执行的是如下算法(数组的forEach方法)
forEach方法将会以插入顺序对Map对象中的每一个键值对执行一次参数中提供的回调函数。
value:可选,元素的值。
key:可选,元素的键。
Map:可选,当前的Map对象。
thisArg:可选,callback执行时其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不严格相等于自身,但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遍历
//---------转成数组----------- var mapData = new Map([["webName", "资源库"], ["url", "www.yuankuwang.com"]]); var arr = [...mapData]; console.log(arr); //---------for--of循环-------- var mapData = new Map([["webName", "资源库"], ["url", "www.yuankuwang.com"]]); for(let elem of mapData) { console.log(elem); } //----------其他函数------------- var keyIterator = mapData.keys();//键遍历器 console.log(keyIterator); var valueIterator = mapData.values(); //值遍历器 console.log(keyIterator.next()); //遍历器用法 console.log(valueIterator); var size = mapData.size; //键值对数量 console.log(size); 复制代码
(二)WeakMap
WeakMap结构与Map结构基本类似。
区别:是它只接受对象作为键名,不接受其他类型的值作为键名。键名是对象的弱引用,当对象被回收后,WeakMap自动移除对应的键值对,WeakMap结构有助于防止内存泄漏。
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属性。
作者:zhulin1028
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。