浅谈ES6部分新特性之Set与Map

当谈到JavaScript中的数据结构时,Set和Map是两个非常有用且强大的类型。它们提供了一种有效地存储和操作数据的方式,比传统的数组和对象更灵活。

Set

Set是一种集合数据结构,其中每个值都必须是唯一的。它不允许重复的元素存在。创建一个Set很简单:

javascript 复制代码
const mySet = new Set();

Set的常用方法:

  1. add(value): 向Set中添加一个值。如果该值已存在,则不会重复添加。

    javascript 复制代码
    const mySet = new Set();
    mySet.add(1);
    mySet.add(2);
  2. delete(value): 删除Set中指定的值。

    javascript 复制代码
    mySet.delete(1);
  3. has(value): 检查Set中是否存在指定的值,返回布尔值。

    javascript 复制代码
    console.log(mySet.has(2)); // true
    console.log(mySet.has(3)); // false
  4. clear(): 清空Set中的所有值。

    javascript 复制代码
    mySet.clear();
  5. size: 获取Set中值的数量。

    javascript 复制代码
    console.log(mySet.size); // 0
  6. forEach(callbackFn, thisArg): 遍历Set中的每个值,可以传入回调函数和可选的上下文。

    javascript 复制代码
    mySet.forEach((value) => {
        console.log(value);
    });

Set的应用场景

1.储存唯一数据: Set 保证其中的值是唯一的,使其在去重数组等场景中非常高效。 2.高效的查找: 使用 Set 的 has 方法可以高效地检查一个值是否存在于集合中。 3.集合运算: Set 提供了一些集合运算的方法,如并集、交集、差集等,方便进行集合操作。

javascript 复制代码
const set1 = new Set([1, 2, 3]);
const set2 = new Set([2, 3, 4]);

const union = new Set([...set1, ...set2]); // 并集
const intersection = new Set([...set1].filter(value => set2.has(value))); // 交集
const difference = new Set([...set1].filter(value => !set2.has(value))); // 差集

console.log([...union]); // [1, 2, 3, 4]
console.log([...intersection]); // [2, 3]
console.log([...difference]); // [1]

WeakSet

WeakSet是一种集合数据结构,它只能包含对象,并且这些对象是弱引用的。弱引用意味着如果没有其他引用指向对象,对象会被垃圾回收器回收,即使它存在于WeakSet中。

创建和基本操作

javascript 复制代码
const weakSet = new WeakSet();

const obj1 = {};
const obj2 = {};

weakSet.add(obj1);
weakSet.add(obj2);

console.log(weakSet.has(obj1)); // true
weakSet.delete(obj2);
console.log(weakSet.has(obj2)); // false

Set不同,WeakSet没有size属性,也没有forEach方法,因为这可能导致无法预测的行为。

使用场景

对象的临时关联: WeakSet通常用于存储对象的临时关联,这样当对象被销毁时,它们也会被自动从集合中移除,有助于避免内存泄漏。

Map

Map是一种键值对的集合,其中键和值可以是任意类型的数据。与对象不同,Map保留了元素的插入顺序。

javascript 复制代码
const myMap = new Map();

Map的常用方法:

  1. set(key, value): 向Map中添加键值对。

    javascript 复制代码
    const myMap = new Map();
    myMap.set('name', 'John');
    myMap.set('age', 25);
  2. get(key): 获取Map中指定键对应的值。

    javascript 复制代码
    console.log(myMap.get('name')); // John
  3. delete(key): 删除Map中指定键值对。

    javascript 复制代码
    myMap.delete('age');
  4. has(key): 检查Map中是否存在指定的键,返回布尔值。

    javascript 复制代码
    console.log(myMap.has('age')); // false
  5. clear(): 清空Map中的所有键值对。

    javascript 复制代码
    myMap.clear();
  6. size: 获取Map中键值对的数量。

    javascript 复制代码
    console.log(myMap.size); // 0
  7. keys(): 返回一个包含Map中所有键的迭代器。

    javascript 复制代码
    const keysIterator = myMap.keys();
    for (const key of keysIterator) {
        console.log(key);
    }
  8. values(): 返回一个包含Map中所有值的迭代器。

    javascript 复制代码
    const valuesIterator = myMap.values();
    for (const value of valuesIterator) {
        console.log(value);
    }
  9. entries(): 返回一个包含Map中所有键值对的迭代器。

    javascript 复制代码
    const entriesIterator = myMap.entries();
    for (const [key, value] of entriesIterator) {
        console.log(`${key}: ${value}`);
    }

Map的应用场景

  1. 键值对存储: Map 是一种键值对的集合,非常适合存储和查找键值对信息。

    javascript 复制代码
    const userInfo = new Map();
    userInfo.set('name', 'John');
    userInfo.set('age', 25);
    
    console.log(userInfo.get('name')); // John
  2. 对象作为键: Map 允许使用对象作为键,这在需要以对象为唯一标识的场景中非常有用。

    javascript 复制代码
    const objKey1 = { id: 1 };
    const objKey2 = { id: 2 };
    
    const objectMap = new Map();
    objectMap.set(objKey1, 'Value 1');
    objectMap.set(objKey2, 'Value 2');
    
    console.log(objectMap.get(objKey1)); // Value 1
  3. 迭代和遍历: Map 提供了多种迭代方法,如 keysvaluesentries,可以方便地遍历键、值或键值对。

    javascript 复制代码
    const myMap = new Map([
      ['name', 'John'],
      ['age', 25],
      ['gender', 'Male']
    ]);
    
    for (const key of myMap.keys()) {
      console.log(key);
    }
    
    // Output:
    // name
    // age
    // gender
  4. 保持键值顺序: 与对象不同,Map 保持键值对的揺入顺序,这在需要有序存储的情况下非常有用。

    javascript 复制代码
    const orderedMap = new Map([
      ['b', 2],
      ['a', 1],
      ['c', 3]
    ]);
    
    console.log([...orderedMap.keys()]); // ['b', 'a', 'c']

WeakMap

WeakMap是一种键值对的集合,其中键是对象,而值可以是任意类型。与Map不同,WeakMap中的键也是弱引用的。

创建和基本操作

javascript 复制代码
const weakMap = new WeakMap();

const key1 = {};
const key2 = {};
const value1 = 'Hello';
const value2 = 'World';

weakMap.set(key1, value1);
weakMap.set(key2, value2);

console.log(weakMap.get(key1)); // Hello
weakMap.delete(key2);
console.log(weakMap.has(key2)); // false

WeakSet一样,WeakMap也没有size属性和forEach方法。

使用场景

  1. 对象的临时关联: WeakMap通常用于存储对象的临时关联,这样当对象被销毁时,它们也会被自动从集合中移除,有助于避免内存泄漏。

  2. 私有数据存储: WeakMap可以用于存储对象的私有数据,因为在对象被销毁时,与之关联的数据也会被清除。

  3. 缓存机制: 可以利用WeakMap来实现简单的缓存机制,当某个键不再被引用时,对应的值也会被垃圾回收。

总结

总体而言,Set Map 提供了更丰富的数据结构和操作方法,可以根据具体需求选择更合适的数据类型;WeakSetWeakMap提供了对对象的弱引用,使得它们在需要确保对象生命周期与集合一致、以及避免内存泄漏的场景中非常有用。它们在 JavaScript 中的应用广泛,分别适用于处理唯一值集合和键值对集合的场景,有助于提高代码的可读性和性能。

最后的最后,我们来写一道leetcode题来巩固一下今天的知识吧!!!

相关推荐
2401_857636393 分钟前
计算机课程管理平台:Spring Boot与工程认证的结合
java·spring boot·后端
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
Martin -Tang2 小时前
Vue 3 中,ref 和 reactive的区别
前端·javascript·vue.js
FakeOccupational3 小时前
nodejs 020: React语法规则 props和state
前端·javascript·react.js
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
曹天骄4 小时前
next中服务端组件共享接口数据
前端·javascript·react.js
2401_857610034 小时前
多维视角下的知识管理:Spring Boot应用
java·spring boot·后端
代码小鑫4 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
颜淡慕潇6 小时前
【K8S问题系列 | 9】如何监控集群CPU使用率并设置告警?
后端·云原生·容器·kubernetes·问题解决
郝晨妤6 小时前
鸿蒙ArkTS和TS有什么区别?
前端·javascript·typescript·鸿蒙