JavaScript 中的线性数据结构包括数组和对象。但是有时候,我们需要使用非线性数据结构,例如哈希表和树等。ES6 中引入了新的数据结构 Map 和 WeakMap,方便我们操作非线性数据结构。本文将介绍 Map 和 WeakMap 的用法和特点,以及使用示例。
Map
Map 是一种键值对的集合,类似于对象,但是 Map 中的键和值类型不限于字符串。我们可以使用任意 JavaScript 类型作为键。这意味着像函数和对象等引用类型也可以作为键。
创建 Map
我们可以创建一个空 Map,然后使用 set 方法添加键值对。我们也可以在创建 Map 的时候就添加键值对:
-- -------------------- ---- ------- ----- --- - --- ------ -- ----- --------------- ------- ---------- ---------- ----------- ---------- -- -------- ----- ---- - --- ----- -------- ------- --- ---------- ---- --------- ---
使用 Map
Map 类提供了很多有用的方法,例如:
- set(key, value):添加键值对
- get(key):获取键对应的值
- has(key):判断是否存在指定键
- delete(key):删除指定键
- clear():清空 Map
- size:返回 Map 中键值对的数量
-- -------------------- ---- ------- ----- --- - --- ------ -- ----- --------------- ------- -------------- ---- -- --- ---------------- -- --- -- ----- --------------- -- ---- -- ----- ------------------- ---------------- -- ----- -- -- --- ------------ --------- -- -
遍历 Map
Map 中的键值对是有序的,我们可以使用 for...of 循环遍历 Map,也可以使用 forEach 方法。Map 也可以转化为数组或对象。
-- -------------------- ---- ------- ----- --- - --- ----- --- ------- --- ------- --- -------- --- -- -------- -- --- ------ ----- ------ -- ---- - -------------------- ----------- - -- ------- -- ------------------- ---- -- - -------------------- ----------- --- -- ----- ----- ----- - --------- -- ----- ----- --- - ------------------------
WeakMap
WeakMap 与 Map 类似,都是键值对的集合。不同的是,WeakMap 的键只能是对象类型,而且这些对象是弱引用的。也就是说,当某个对象作为键被清空时,其对应的值也会被自动清除。
因为 WeakMap 中的键是弱引用,如果某个键所引用的对象仅存在于 WeakMap 中,那么垃圾回收机制可能会将其清空。因此,我们不能直接访问 WeakMap 中存储的键值对。
创建 WeakMap
我们可以使用 new WeakMap() 创建一个新的 WeakMap。
const weakMap = new WeakMap();
使用 WeakMap
WeakMap 中提供的方法和 Map 类似,不同的是,它不能使用 forEach 方法和 clear() 方法。
-- -------------------- ---- ------- ----- ------- - --- ---------- ----- ---- - ------ ------- ----- ---- - ----- ---- ----------------- ---------- ----------------- ---------- ------------------ -- ------ ------------------ -- ---- ---------------------
总结
本文介绍了 ES6 中新增加的非线性数据结构 Map 和 WeakMap,它们的特点和用法。Map 可以使用任意类型的键,而 WeakMap 的键只能是对象类型。使用这些新的数据结构,我们可以更轻松地操作非线性数据结构。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6486849c48841e9894512c82