Map和WeakMap是ES6新增的数据结构
一、Map
它们本质与对象一样,都是键值对的集合,但是他们与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"};
(objKey, "对象键"); //添加新元素
((objKey)); //获取
((objKey)); //判断是否含有
((objKey)); //删除键
(); //清空
2.数组作为构造函数参数
var mapData = new Map([["webName", "资源库"], ["url", ""]]);
();
(("webName"));
(("webName"));
(("url"));
(("url"));
构造函数参数为数组执行的是如下算法(数组的forEach方法)
forEach方法将会以插入顺序对Map对象中的每一个键值对执行一次参数中提供的回调函数。
value:可选,元素的值。
key:可选,元素的键。
Map:可选,当前的Map对象。
thisArg:可选,callback执行时其this的值。
(function (value,key) {
(value,key);
})
var arr = [["webName", "资源库"], ["url", ""]];
var mapData = new Map();
(([key, value]) => (key, value));
3.由于Map对象的键可以是对象,所以只有对同一个对象的引用,Map对象才将其视为同一个键。
NaN不严格相等于自身,但Map将其视为同一个键
let mapData = new Map();
(NaN, 5);
((NaN));
(-0, 5);
((+0));
遍历
//---------转成数组-----------
var mapData = new Map([["webName", ""], ["url", ""]]);
var arr = [...mapData];
(arr);
//---------for--of循环--------
var mapData = new Map([["webName", ""], ["url", ""]]);
for(let elem of mapData) {
(elem);
}
//----------其他函数-------------
var keyIterator = ();//键遍历器
(keyIterator);
var valueIterator = (); //值遍历器
(()); //遍历器用法
(valueIterator);
var size = ; //键值对数量
(size);
八、WeakMap数据结构
WeakMap结构与Map结构基本类似。
区别是它只接受对象作为键名,不接受其他类型的值作为键名。键名是对象的弱引用,当对象被回收后,WeakMap自动移除对应的键值对,WeakMap结构有助于防止内存泄漏。
var wm = new WeakMap();
var obj = new Object();
(obj,'对象1');
obj=null;
(obj); //undefined
(obj); //false
由于WeakMap对象不可遍历,所以没有size属性。