在 ES6 中,Map 和 WeakMap 是两个新的数据结构,它们可以用来存储键值对。Map 是一个比较常用的数据结构,它的键可以是任意值(包括函数、对象、NaN 等),而 WeakMap 只能使用对象作为键(因为 WeakMap 中存储的是对象的弱引用)。本文将深入讨论 Map 和 WeakMap 的使用,以及它们的区别和优缺点。
Map 的基本使用
Map 的创建可以使用 new Map(),也可以使用数组创建,如下所示:
let map = new Map(); map.set('key1', 'value1'); map.set('key2', 'value2'); console.log(map); // Map { 'key1' => 'value1', 'key2' => 'value2' } let array = [['key1', 'value1'], ['key2', 'value2']]; let map2 = new Map(array); console.log(map2); // Map { 'key1' => 'value1', 'key2' => 'value2' }
其中,set 方法用于添加新的键值对,get 方法用于获取某个键对应的值,has 方法用于判断某个键是否存在,delete 方法用于删除某个键值对,size 属性用于获取 Map 中的键值对个数,如下所示:
let map = new Map(); map.set('key1', 'value1'); map.set('key2', 'value2'); console.log(map.get('key1')); // 'value1' console.log(map.has('key2')); // true map.delete('key2'); console.log(map); // Map { 'key1' => 'value1' } console.log(map.size); // 1
Map 还提供了一些其他方法,比如 keys、values 和 entries 方法,用于获取 Map 中的所有键、所有值,以及所有键值对:
let map = new Map(); map.set('key1', 'value1'); map.set('key2', 'value2'); console.log(map.keys()); // [Map Iterator] { 'key1', 'key2' } console.log(map.values()); // [Map Iterator] { 'value1', 'value2' } console.log(map.entries()); // [Map Entries] { [ 'key1', 'value1' ], [ 'key2', 'value2' ] }
WeakMap 的基本使用
WeakMap 使用对象作为键时,存储的是对象的弱引用。当这个对象被回收时,对应的键值对会被自动删除。WeakMap 的创建方式和 Map 一样,如下所示:
let key1 = { name: 'key1' }; let key2 = { name: 'key2' }; let weakMap = new WeakMap([[key1, 'value1']]); weakMap.set(key2, 'value2'); console.log(weakMap.get(key1)); // 'value1' console.log(weakMap.has(key2)); // true key1 = null; console.log(weakMap.get(key1)); // undefined console.log(weakMap.size); // undefined
需要注意的是,由于 WeakMap 存储的是对象的弱引用,它的键必须是对象,并且不能被枚举。即使添加到 WeakMap 中的对象已经被删除,如果有其他地方仍然引用该对象,WeakMap 中的键值对也不会被删除。
Map 和 WeakMap 的区别
Map 和 WeakMap 的主要区别在于键值的引用类型和存储方式。普通的 Map 针对任意类型的键可以使用,而 WeakMap 只允许使用对象作为键,并且存储的是对象的弱引用。由于使用了弱引用,WeakMap 中的键值对不会影响垃圾回收,因此可以防止内存泄漏。
另外,Map 中的键值对可以通过遍历方式获取,而 WeakMap 中的键值对不能获得。WeakMap 的另一个限制是不能使用 size 属性来获取键值对的数量,因此只能使用 has 方法判断是否存在某个键值对。
总结
Map 和 WeakMap 是两个常用的 ES6 数据结构,用于存储键值对。Map 可以使用任意类型的键,WeakMap 只能使用对象作为键,并且存储的是对象的弱引用。使用时应根据具体情况选用合适的数据结构,以便更好地管理键值对,避免内存泄漏。
示例代码: https://codepen.io/pen/?template=xxdjzVW
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a64353add4f0e0ffeff31e