简述Set、Map、WeakSet 和 WeakMap 的区别 ?

Set、Map、WeakSet 和 WeakMap 都是 ES6 中引入的新的数据结构。他们的主要区别如下:

  1. Set:Set是一种特殊的列表,元素只能是唯一的(没有重复的元素),并且元素可以是任意类型。Set有一些有用的方法,如add、delete、has等。
    let set = new Set();
    set.add(1);
    set.add('1');
    console.log(set.has(1));  // 输出 true
    console.log(set.size);  // 输出 2,因为1和'1'被视为两个不同的元素
    
  2. WeakSet:WeakSet与Set类似,但有两个关键的区别。首先,WeakSet的元素只能是对象,不能是其他类型的值。其次,WeakSet中的对象都是弱引用的,如果没有其他地方引用这个对象,它会被垃圾回收掉,而且WeakSet没有size属性,不能遍历它的元素。
    let weakSet = new WeakSet();
    let obj = {};
    weakSet.add(obj);
    console.log(weakSet.has(obj));  // 输出 true
    
  3. Map:Map是一种特殊的键值对列表,键和值可以是任意类型。Map有一些有用的方法,如set、get、has、delete等。
    let map = new Map();
    map.set(1, 'one');
    map.set('1', 'one');
    console.log(map.get(1));  // 输出 'one'
    console.log(map.size);  // 输出 2,因为1和'1'被视为两个不同的键
    
  4. WeakMap:WeakMap与Map类似,但也有两个关键的区别。首先,WeakMap的键只能是对象,不能是其他类型的值。其次,WeakMap中的键名所指向的对象,是弱引用的,如果没有其他地方引用这个对象,它会被垃圾回收掉,而且WeakMap没有size属性,不能遍历它的键值。
    let weakMap = new WeakMap();
    let obj = {};
    weakMap.set(obj, 'object');
    console.log(weakMap.get(obj));  // 输出 'object'
    

总的来说,Set和Map可以存储任意类型的键值,支持遍历,且键值是强引用的;而WeakSet和WeakMap只能存储对象类型的键值,不支持遍历,且键值是弱引用的,适合处理大量数据且不需要遍历的场景,能有效防止内存泄漏。

发表评论

后才能评论