ES6 中的 Map 和 WeakMap 的使用详解

在 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


纠错反馈