JavaScript前端面试题——JS 中 Map 和 WeakMap 有什么区别 ?

刷了面试题之后才知道自己的知识是多么薄弱,这题我连Map 和 WeakMap是什么都不知道

参考答案

在 JavaScript 中,Map 和 WeakMap 都是键值对的集合,但它们有几个重要的区别:

1.键类型:Map 对象的键可以是任何类型,包括基本数据类型和对象类型,而 WeakMap 对象的键必须是对象类型。

2.垃圾回收:Map 对象中的键和值都会被常规垃圾回收机制回收,而 WeakMap 中的键是弱引用,即在对象被垃圾回收时,WeakMap 中对应的键值对也会被自动删除。这使得 WeakMap 通常用于缓存或元数据,当对象不再被使用时,WeakMap 可以自动清除对应的数据,避免内存泄漏。

3.迭代器:Map 对象有内置的迭代器,可以通过 for..of 循环来遍历键值对,而 WeakMap 没有内置的迭代器,因此不能直接遍历键值对。

综上所述,Map 和 WeakMap 在功能上有所重叠,但应用场景不同。Map 可以存储任何类型的键值对,适用于大部分情况;WeakMap 适用于需要自动清除的缓存和元数据场景。

Map 和 WeakMap 介绍

为了避免有小伙伴和我一样连 map 和 weakmap 是什么都不知道,我在这里详细介绍一下。

MapWeakMap 是 ECMAScript 2015(ES6)引入的两种数据结构,用于改进键值对的管理方式。

Map

  • 用途Map 用于存储和管理键值对,键和值都可以是任意数据类型。
  • 特点
    • 键的顺序:Map 按照键插入的顺序存储元素。
    • 大小:可以使用 size 属性获取 Map 的元素数量。
    • 迭代:Map 可以按插入顺序进行迭代。(迭代就是遍历的意思)
    • 键的类型:Map 的键可以是任何数据类型,包括对象。
const map = new Map();
map.set('name', 'Alice');
map.set(1, 'One');
console.log(map.get('name')); // Alice
console.log(map.size); // 2

WeakMap

  • 用途WeakMap 主要用于存储对象的元数据,并且具有垃圾回收的特性
  • 特点
    • 键的类型:WeakMap 只允许对象作为键,不能使用基本数据类型(如数字、字符串等)。
    • 垃圾回收:WeakMap 对象的键是弱引用,这意味着,如果没有其他引用指向某个对象,该对象可以被垃圾回收器回收,而不影响 WeakMap
    • 不可枚举:WeakMap 不支持迭代器方法,因此不能像 Map 一样进行遍历。
    • 没有 size 属性:由于其键的垃圾回收特性,WeakMap 不提供元素计数。
const weakMap = new WeakMap();
const obj = {};
weakMap.set(obj, 'value');
console.log(weakMap.get(obj)); // value

相关名词解释——元数据

元数据(Metadata)是描述数据的数据。它提供了关于数据的附加信息,用于帮助解释、组织、管理或理解数据的实际内容和结构。在编程中,元数据通常指的是附加的、用于描述或管理对象、数据结构或程序元素的信息。

相关名词解释——弱引用及垃圾回收

弱引用是一种特殊类型的引用,它不会阻止垃圾回收器回收对象。当一个对象只有弱引用指向它时,垃圾回收器可以在没有其他强引用的情况下回收该对象,从而释放内存。

具体来说:

  • MapMap 中的键和值都是强引用。即使键所引用的对象在其他地方没有引用,只要 Map 中还存在这个键,它所引用的对象就不会被垃圾回收。这样,即使这些对象在程序的其他部分不再使用,只要 Map 还存在,这些对象仍然会保留在内存中。

  • WeakMapWeakMap 中的键是弱引用,这意味着如果 WeakMap 中的键所引用的对象在程序的其他地方不再被引用,那么这个对象会被垃圾回收,WeakMap 中对应的键值对也会自动被删除。WeakMap 不会阻止键所引用的对象被垃圾回收,这对于避免内存泄漏非常有用。

代码示例

const weakMap = new WeakMap();
let obj = { name: 'example' };

weakMap.set(obj, 'some metadata');

// 只有弱引用指向 obj,若 obj 不再被引用,它将被回收
obj = null; // 删除强引用

// 由于 obj 被回收,weakMap 中的对应条目也会被自动移除

总结

  • Map:适用于需要保持键值对插入顺序、允许多种数据类型作为键、需要遍历和获取大小的场景。
  • WeakMap:适用于需要将对象作为键并确保这些键不会阻止对象被垃圾回收的场景,通常用于存储对象的元数据。

你可能感兴趣的:(开发语言,javascript,前端)