JavaScript中Set、Map、WeakSet和WeakMap的特性与应用

2025/3/8
本文详细介绍了JavaScript中的四种集合类型Set、Map、WeakSet和WeakMap,阐述了它们各自的用途、特性及常用方法,帮助读者了解并在合适场景选择使用。
展示Set、Map、WeakSet和WeakMap数据结构特点的可视化图片,包含各自特性、方法示例的示意图片

SetMapWeakSetWeakMap 是 JavaScript 中的四种集合类型,它们各自有不同的用途和特性。以下是对它们的详细解释:

1. Set

Set 是一种集合数据结构,它允许你存储唯一值(无论是原始值还是对象引用)。Set 中的值是无序的,且不会重复。

主要特性:

  • 唯一性Set 中的值不会重复,如果尝试添加一个已经存在的值,操作会被忽略。
  • 无序性Set 中的值没有索引,不能通过索引访问。
  • 可迭代Set 是可迭代的,可以使用 for...of 循环或 forEach 方法遍历。

常用方法:

  • add(value):向 Set 中添加一个值。
  • delete(value):从 Set 中删除一个值。
  • has(value):检查 Set 中是否包含某个值。
  • clear():清空 Set 中的所有值。
  • size:获取 Set 中值的数量。
const mySet = new Set();
mySet.add(1);
mySet.add(2);
mySet.add(2); // 重复值,不会被添加
console.log(mySet.size); // 2
console.log(mySet.has(1)); // true

2. Map

Map 是一种键值对的集合,类似于对象,但键可以是任意类型(包括对象),而不仅仅是字符串或符号。

主要特性:

  • 键的多样性Map 的键可以是任意类型,包括对象、函数等。
  • 有序性Map 中的键值对是有序的,按照插入顺序排列。
  • 可迭代Map 是可迭代的,可以使用 for...of 循环或 forEach 方法遍历。

常用方法:

  • set(key, value):向 Map 中添加一个键值对。
  • get(key):获取指定键对应的值。
  • delete(key):删除指定键的键值对。
  • has(key):检查 Map 中是否包含某个键。
  • clear():清空 Map 中的所有键值对。
  • size:获取 Map 中键值对的数量。
const myMap = new Map();
const keyObj = {};
myMap.set(keyObj, 'value associated with keyObj');
console.log(myMap.get(keyObj)); // 'value associated with keyObj'
console.log(myMap.size); // 1

3. WeakSet

WeakSet 是一种特殊的 Set,它只能存储对象引用,并且这些引用是弱引用,即不会阻止垃圾回收机制回收这些对象。

主要特性:

  • 弱引用WeakSet 中的对象是弱引用,如果没有其他引用指向这些对象,它们会被垃圾回收。
  • 不可迭代WeakSet 不可迭代,没有 size 属性,也没有 clear 方法。
  • 只能存储对象WeakSet 只能存储对象,不能存储原始值。

常用方法:

  • add(value):向 WeakSet 中添加一个对象。
  • delete(value):从 WeakSet 中删除一个对象。
  • has(value):检查 WeakSet 中是否包含某个对象。
const myWeakSet = new WeakSet();
const obj1 = {};
const obj2 = {};
myWeakSet.add(obj1);
myWeakSet.add(obj2);
console.log(myWeakSet.has(obj1)); // true

4. WeakMap

WeakMap 是一种特殊的 Map,它只能使用对象作为键,并且这些键是弱引用,即不会阻止垃圾回收机制回收这些对象。

主要特性:

  • 弱引用WeakMap 中的键是弱引用,如果没有其他引用指向这些键对象,它们会被垃圾回收。
  • 不可迭代WeakMap 不可迭代,没有 size 属性,也没有 clear 方法。
  • 只能使用对象作为键WeakMap 的键必须是对象,不能是原始值。

常用方法:

  • set(key, value):向 WeakMap 中添加一个键值对。
  • get(key):获取指定键对应的值。
  • delete(key):删除指定键的键值对。
  • has(key):检查 WeakMap 中是否包含某个键。
const myWeakMap = new WeakMap();
const keyObj = {};
myWeakMap.set(keyObj, 'value associated with keyObj');
console.log(myWeakMap.get(keyObj)); // 'value associated with keyObj'

总结

  • Set:用于存储唯一值的集合。
  • Map:用于存储键值对的集合,键可以是任意类型。
  • WeakSet:用于存储对象的弱引用集合,不可迭代。
  • WeakMap:用于存储键值对的集合,键必须是对象且是弱引用,不可迭代。

这些集合类型在不同的场景下有不同的用途,选择合适的集合类型可以提高代码的效率和可维护性。

标签:ES6JavaScript
上次更新:

相关文章

npx完全指南:前端开发必备工具详解 | 20年架构师深度解析

本文由20年前端架构师深入解析npx工具,涵盖其核心功能、优势、高级用法、最佳实践及与npm/yarn的区别比较,帮助开发者掌握这一现代前端开发利器。

·前端开发

Astro 静态站点生成器:构建高性能网站的最佳选择

Astro 是一个专注于构建快速、轻量级网站的静态站点生成器,支持多种前端框架,采用岛屿架构减少 JavaScript 加载,提升性能。

·前端开发

MySQL JSON数据类型支持与使用指南 | 详细解析与示例

本文详细解析了MySQL从5.7版本开始支持的JSON数据类型,包括版本支持、创建JSON字段、插入与查询JSON数据、修改JSON数据、生成JSON、索引优化、性能与应用场景、注意事项及示例全流程。

·后端开发

Weex 跨平台移动开发框架:核心特性与使用指南

Weex 是由阿里巴巴开源的跨平台移动开发框架,支持使用 Vue.js 或 Rax 构建高性能的 iOS、Android 和 Web 应用。本文详细解析了 Weex 的核心特性、架构、工作流程、组件和模块、开发工具、优缺点、应用场景及未来发展。

·前端开发

ECharts 与 DataV 数据可视化工具对比分析 | 选择指南

本文详细对比了 ECharts 和 DataV 两个常用的数据可视化工具,包括它们的设计目标、优缺点、使用场景和技术栈,帮助读者根据具体需求选择合适的工具。

·前端开发

前端部署后通知用户刷新页面的常见方案 | 单页应用更新提示

本文介绍了在前端部署后通知用户刷新页面的几种常见方案,包括WebSocket实时通知、轮询检查版本、Service Worker版本控制、版本号对比、自动刷新、使用框架内置功能以及第三方库。每种方案的优缺点和示例代码均有详细说明。

·前端开发

TypeScript 映射类型常见问题与解决方案 | 提升代码维护性

本文探讨了在使用 TypeScript 时,映射类型的不当使用可能导致的问题,如代码难以维护、类型推断不准确或性能问题,并提供了相应的解决方案和最佳实践。

·编程语言

TypeScript 交叉类型与联合类型:区别与最佳实践

本文详细解释了 TypeScript 中交叉类型(Intersection Types)和联合类型(Union Types)的区别,提供了使用场景、类型守卫、避免过度使用交叉类型的建议,以及如何通过工具辅助解决混淆问题。

·编程语言

TypeScript 类继承中的常见类型问题及解决方案 | TypeScript 开发指南

本文详细探讨了在 TypeScript 中使用类继承时可能遇到的常见类型问题,包括类型兼容性、构造函数、方法重写、访问修饰符、泛型类继承、抽象类以及类型断言等问题,并提供了相应的解决方案和代码示例。

·编程语言

TypeScript 函数重载:常见问题与解决方案

本文探讨了 TypeScript 中函数重载的常见问题,包括签名与实际实现不匹配、重载签名过多、与泛型结合时的类型推断问题等,并提供了相应的解决方案。

·编程语言