js的ES6语法Map,WeakMap

134 阅读2分钟

Map

基本语法

Map是ES6的新语法,与对象类似,是一组键值对的结构,他们最大的区别就是Map的键可以是任何类型。

  • 具有极快的查找速度
  • 函数、对象、基本类型都可以作为键或值
let map = new Map([["1", "开源"]]); //初始化数据
let obj = {
  name: "后盾人",
};
map.set(obj, "houdunren.com").set("name", "hdcms"); //使用 set 方法添加元素,支持链式操作
console.log(map.size); //3 获取元素数量
console.log(map.has(obj)); //true 检测元素是否存在
console.log(map.get("name")); //hdcms 读取元素
map.delete("name"); //true 使用 delete 方法删除单个元素
map.clear(); //true   使用 clear 删除所有元素

数组转换

可以使用点语法Array.form 静态方法将Map类型转为数组,这样就可以使用数组处理函数了

let hd = new Map([
  ["houdunren", "后盾人"],
  ["hdcms", "开源系统"],
]);
console.log([...hd]); //['houdunren', '后盾人']、['hdcms', '开源系统']
console.log(Array.from(hd)); //['houdunren', '后盾人']、['hdcms', '开源系统']

遍历数据

使用 keys()/values()/entries() 都可以返回可遍历的迭代对象。

let hd = new Map([
  ["houdunren", "后盾人"],
  ["hdcms", "开源系统"],
]);
console.log(hd.keys()); //MapIterator {"houdunren", "hdcms"}
console.log(hd.values()); //MapIterator {"后盾人", "开源系统"}
console.log(hd.entries()); //MapIterator {"houdunren" => "后盾人", "hdcms" => "开源系统"}

可以使用keys/values 函数遍历键与值

let hd = new Map([["houdunren", "后盾人"], ["hdcms", "开源系统"]]);
for (const key of hd.keys()) {
  console.log(key);
}
for (const value of hd.values()) {
  console.log(value);
}

使用for/of遍历操作,直播遍历Map 等同于使用entries() 函数

let hd = new Map([["houdunren", "后盾人"], ["hdcms", "开源系统"]]);
for (const [key, value] of hd) {
  console.log(`${key}=>${value}`);
}

使用forEach遍历操作

let hd = new Map([["houdunren", "后盾人"], ["hdcms", "开源系统"]]);
hd.forEach((value, key) => {
  console.log(`${key}=>${value}`);
});

WeakMap

和Map相同,只不过它的键必须只能是对象类型的值。

  • 键名必须是对象

  • WeaMap对键名是弱引用的,键值是正常引用

  • 垃圾回收不考虑WeaMap的键名,不会改变引用计数器,键在其他地方不被引用时即删除

  • 因为WeakMap 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作

  • 也是因为弱引用,WeaMap 结构没有keys( ),values( ),entries( )等方法和 size 属性

  • 当键的外部引用删除时,希望自动删除数据时使用 WeakMap

基本操作

const hd = new WeakMap();
const arr = ["hdcms"];
//添加操作
hd.set(arr, "houdunren");
console.log(hd.has(arr)); //true
//删除操作
hd.delete(arr);
//检索判断
console.log(hd.has(arr)); //false

垃圾回收

WakeMap的键名对象不会增加引用计数器,如果一个对象不被引用了会自动删除。

  • 下例当hd删除时内存即清除,因为WeakMap是弱引用不会产生引用计数
  • 当垃圾回收时因为对象被删除,这时WakeMap也就没有记录了