JS中Set、WeakSet、Map 和 WeakMap区别

ES6引入的四种新的数据结构,它们各自有不同的特性和用途。

  1. Set:

    • Set是一种集合数据结构,成员的值都是唯一的,没有重复的值。
    • 它可以包含任何类型的原始值或对象引用。
    • Set是可迭代的,可以使用for...of循环遍历。
    • 提供了adddeletehas等方法来操作集合。

    let set = new Set();
    set.add(1);
    set.add(2);
    set.add(3);
    for (let value of set) {
      console.log(value); // 1, 2, 3
    }
    
  2. WeakSet:

    • WeakSetSet类似,但其成员都是对象,并且对对象的引用是弱引用。
    • 如果一个对象没有被其他引用所指向,那么它可能会被垃圾回收机制回收,WeakSet不会阻止这个过程。
    • WeakSet是不可迭代的,但提供了adddeletehas等方法。

    let weakSet = new WeakSet();
    let obj = {};
    weakSet.add(obj);
    console.log(weakSet.has(obj)); // true
    
  3. Map:

    • Map是一种映射数据结构,类似于对象,但是键可以是任意类型的值(包括对象)。
    • 它是可迭代的,可以使用for...of循环遍历。
    • 提供了setgethasdelete等方法来操作映射。
    • Map中的键值对是有序的,按照添加的顺序排列。

    let map = new Map();
    map.set('name', 'John');
    map.set('age', 30);
    for (let [key, value] of map) {
      console.log(key + ': ' + value); // name: John, age: 30
    }
    
  4. WeakMap:

    • WeakMapMap类似,但其键只能是对象(null除外),并且对对象的引用是弱引用。
    • 如果一个对象没有被其他引用所指向,那么它可能会被垃圾回收机制回收,WeakMap不会阻止这个过程。
    • WeakMap是不可迭代的,但提供了sethasdelete等方法。

    let weakMap = new WeakMap();
    let obj = {};
    weakMap.set(obj, 'value');
    console.log(weakMap.has(obj)); // true
    

总结:

  • SetWeakSet主要用于存储唯一值,区别在于Set可以存储任何类型的值,而WeakSet只能存储对象,并且对对象的引用是弱引用。
  • MapWeakMap主要用于存储键值对,区别在于Map的键可以是任意类型的值,而WeakMap的键只能是对象,并且对对象的引用是弱引用。

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