Map
Map 是一种新的数据结构,它可以将任意类型的值作为键,所以它比 Object 更灵活。 Map 的初始化可以通过 Array 或者对象字面量进行初始化。
基本用法
Map 中有以下几个主要的方法:
set:
用来设置键值对,类型可以是任意类型。
-- -------------------- ---- ------- ----- ----- - --- ------ ----------------- -------- ------------ ------- ----------- ---- -- -- ---------- ------------------------------- -- ---- -------------------------- -- --- ----------------------- ---- -- ---- -- --------------------------
get:
用来获取指定键的值。
-- -------------------- ---- ------- ----- ----- - --- ------ ----------------- -------- ------------ ------- ----------- ---- -- -- ---------- ------------------------------- ------ -------------------------- ----- ----------------------- ---- -- ---- -----------
has:
用来判断 Map 中是否有指定键。
const myMap = new Map(); myMap.set("name", "Lucy"); myMap.set(1, "one"); myMap.set({ age: 18 }, "Object"); console.log(myMap.has("name")); //true console.log(myMap.has("sdf")); //false
size:
用来获取 Map 中所有键值对的数量。
const myMap = new Map(); myMap.set("name", "Lucy"); myMap.set(1, "one"); myMap.set({ age: 18 }, "Object"); console.log(myMap.size); //3
delete:
用来删除指定键的值。
const myMap = new Map(); myMap.set("name", "Lucy"); myMap.set(1, "one"); myMap.set({ age: 18 }, "Object"); myMap.delete("name"); console.log(myMap.get("name")); //undefined
clear:
用来清空 Map。
const myMap = new Map(); myMap.set("name", "Lucy"); myMap.set(1, "one"); myMap.set({ age: 18 }, "Object"); myMap.clear(); console.log(myMap.size); //0
遍历方法
Map 中可以使用以下几种方法进行遍历:
keys:
用来遍历 Map 中所有的键。
-- -------------------- ---- ------- ----- ----- - --- ------ ----------------- -------- ------------ ------- ----------- ---- -- -- ---------- --- ------ --- -- ------------- - ----------------- -- ----- -- - ---- -- - -
values:
用来遍历 Map 中所有的值。
-- -------------------- ---- ------- ----- ----- - --- ------ ----------------- -------- ------------ ------- ----------- ---- -- -- ---------- --- ------ ----- -- --------------- - ------------------- ------- ---- ------ -
entries:
用来遍历 Map 中所有的键值对。
-- -------------------- ---- ------- ----- ----- - --- ------ ----------------- -------- ------------ ------- ----------- ---- -- -- ---------- --- ------ ----- ------ -- ---------------- - ---------------- ------- ------ ----- - ---- - ---- -- - ------ - -------- --- ------ ----- ------ -- ------ - ---------------- ------- ------ ----- - ---- - ---- -- - ------ -
forEach:
用来遍历 Map 中的所有键值对,可以传入一个回调函数。
-- -------------------- ---- ------- ----- ----- - --- ------ ----------------- -------- ------------ ------- ----------- ---- -- -- ---------- --------------------- ---- -- - ---------------- ------- ------ ----- - ---- - ---- -- - ------ ---
WeakMap
WeakMap 是 Map 的一种变体,它的键只能是对象,并且只能使用 set、get、has、delete 方法。
WeakMap 有以下特点:
WeakMap 中的键必须是对象,不能是原始类型或 null。
WeakMap 中的键是弱引用,不会阻止 GC 对该对象的回收。
WeakMap 中的键是不可枚举的,即不能使用 keys、values、forEach 等方法进行遍历。
基本用法
const myWeakMap = new WeakMap(); const key = {}; myWeakMap.set(key, "value"); console.log(myWeakMap.get(key)); // value myWeakMap.delete(key); console.log(myWeakMap.get(key)); // undefined
应用场景
WeakMap 通常用于存储 DOM 节点相关的数据,可以防止内存泄漏。比如下面的例子,我们可以用 WeakMap 存储一个节点的绑定事件,避免在节点被销毁时事件不能被释放从而导致内存泄漏。
-- -------------------- ---- ------- ----- --------- - --- ---------- ----- ---- - ---------------------------------- ------------------- - ------ ---------- - --------------------- -- --- ------------------------------ ---------------------------
总结
Map 和 WeakMap 是 ES6 中引入的新的数据结构。Map 可以存储任意类型的键值对, 并提供了丰富的遍历方法;WeakMap 只能存储对象类型的键值对, 但是它的键是弱引用,不会阻止 GC 执行垃圾回收, 避免了内存泄漏的问题。在实际应用中,我们可以根据具体场景选择使用 Map 或 WeakMap 数据结构。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648eaf0648841e9894d11bbd