【JavaScript】Set、Map、WeakSet、WeakMap

2023-12-27 18:52
文章标签 java script set map weakmap weakset

本文主要是介绍【JavaScript】Set、Map、WeakSet、WeakMap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

✨ 专栏介绍

在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景,并且不断发展演进。在本专栏中,我们将深入学习JavaScript语言的基本语法、DOM操作、事件处理、异步编程以及常见算法和数据结构等内容。此外,我们还将介绍ES6及其后续版本中引入的新特性,如箭头函数、模块化、解构赋值等。通过学习这些内容,你将能够成为一名熟练的JavaScript开发者,并能够应用这些知识来构建出高质量和可维护的Web应用程序。让我们一起开始JavaScript之旅吧!

在这里插入图片描述

文章目录

    • ✨ 专栏介绍
    • 引言
    • 一、Set
    • 二、Map
    • 三、WeakSet
    • 四、WeakMap
    • 总结
    • 😶 写在结尾
        • `前端设计模式专栏`
        • `Vue专栏`
        • `JavaScript(ES6)专栏`


引言

Set、Map、WeakSet和WeakMap是ES6引入的新的数据结构,它们在处理数据时具有不同的特性和用途。本文将详细介绍它们的用法、特性、区别、优缺点以及使用场景和注意事项,并给出相应的代码示例。

一、Set

Set是一种类似于数组的数据结构,它存储唯一值,不允许重复。可以使用add()、delete()和has()方法来操作集合中的元素。Set中的值是无序的,可以通过迭代器进行遍历。

优点

  • 快速查找元素是否存在。
  • 去重。

缺点

  • 不能直接通过索引访问元素。

使用场景

去重:可以使用Set来快速去除数组中的重复元素。

判断元素是否存在:可以使用Set来判断某个元素是否存在于集合中。

// 去重
const arr = [1, 2, 3, 3, 4, 5, 5];
const uniqueSet = new Set(arr);
console.log([...uniqueSet]); // [1, 2, 3, 4, 5]
// 判断元素是否存在
const set = new Set([1, 2, 3]);
console.log(set.has(2)); // true
console.log(set.has(4)); // false

二、Map

Map是一种键值对存储数据的数据结构,类似于对象。每个键对应一个值。可以使用set()、get()、delete()和has()等方法来操作键值对。

优点

  • 可以使用任何类型作为键。
  • 提供了丰富的方法来操作键值对。

缺点

  • 相对于对象,Map的性能稍差。

使用场景

存储和查找数据:可以使用Map来存储和查找数据,键值对的形式更加直观和灵活。

// 存储和查找数据
const map = new Map();
map.set('name', 'John');
map.set('age', 30);
console.log(map.get('name')); // John
// 遍历键值对
for (let [key, value] of map) {console.log(key + ' = ' + value);
}

在这里插入图片描述

三、WeakSet

WeakSet是一种特殊的Set,它只能存储对象,并且对象是弱引用关联的。WeakSet中存储的对象是弱引用关联的,即如果没有其他引用指向该对象,则该对象会被垃圾回收。WeakSet没有迭代器,不能遍历其中的元素。

优点

  • 不会造成内存泄漏:由于WeakSet中存储的对象是弱引用关联的,不会阻止被引用对象被垃圾回收。

缺点

  • 功能较弱:由于无法遍历和获取大小等限制,功能相对有限。

使用场景

存储临时数据:可以使用WeakSet来存储临时数据,不用担心内存泄漏的问题。

// 存储临时数据
let obj1 = { name: 'John' };
let obj2 = { name: 'Jane' };
const weakSet = new WeakSet([obj1, obj2]);
// 注意:WeakSet没有迭代器,不能遍历其中的元素

四、WeakMap

WeakMap是一种特殊的Map,它只能使用对象作为键,并且键是弱引用关联的。WeakMap中使用的对象作为键是弱引用关联的,即如果没有其他引用指向该对象,则该对象会被垃圾回收。WeakMap没有迭代器,不能遍历其中的键值对。

优点

  • 不会造成内存泄漏:由于WeakMap中使用的对象作为键是弱引用关联的,不会阻止被引用对象被垃圾回收。

缺点

  • 功能较弱:由于无法遍历和获取大小等限制,功能相对有限。

使用场景

存储私有数据:可以使用WeakMap来存储私有数据,只有拥有对应的键才能访问到私有数据。

// 存储私有数据
let privateData = new WeakMap()
class Person {constructor(name) {privateData.set(this, { name })}getName() {return privateData.get(this).name}
}
let person = new Person("John")
console.log(person.getName()) // John
// 注意:WeakMap没有迭代器,不能遍历其中的键值对

总结

通过以上代码示例,我们可以看到Set、Map、WeakSet和WeakMap的用法和特性。

在Set和Map中,如果一个对象被添加到集合中,即使在其他地方不再引用该对象,它仍然会被集合保留,不会被垃圾回收机制回收。这可能导致内存泄漏,特别是在长时间运行的应用程序中。

而在WeakSet和WeakMap中,存储的对象是弱引用关联的。这意味着如果一个对象只有在WeakSet或WeakMap中存在引用,并且没有其他地方引用它,那么该对象将被垃圾回收机制自动回收。这样可以有效地避免内存泄漏问题。

另外,由于弱引用关联的特性,WeakSet和WeakMap没有提供像Set和Map那样的迭代器方法来遍历元素。也没有size属性来获取元素个数。这是为了确保不会干扰垃圾回收机制对对象的处理。

因此,当需要存储临时数据或私有数据,并且希望避免内存泄漏时,使用WeakSet和WeakMap是更合适的选择。它们提供了一种轻量级、安全且不会造成内存泄漏的数据存储方式。


😶 写在结尾

前端设计模式专栏

在这里插入图片描述
设计模式是软件开发中不可或缺的一部分,它们帮助我们解决了许多常见问题,并提供了一种优雅而可靠的方式来构建应用程序。在本专栏中,我们介绍了所有的前端设计模式,包括观察者模式、单例模式、策略模式等等。通过学习这些设计模式,并将其应用于实际项目中,我们可以提高代码的可维护性、可扩展性和可重用性。希望这个专栏能够帮助你在前端开发中更好地应用设计模式,写出高质量的代码。点击订阅前端设计模式专栏

Vue专栏

在这里插入图片描述

Vue.js是一款流行的JavaScript框架,用于构建用户界面。它采用了MVVM(Model-View-ViewModel)的架构模式,通过数据驱动和组件化的方式,使开发者能够更轻松地构建交互性强、可复用的Web应用程序。在这个专栏中,我们将深入探讨Vue.js的核心概念、组件开发、状态管理、路由和性能优化等方面的知识。我们将学习如何使用Vue.js构建响应式的用户界面,并探索其强大的生态系统,如Vue Router和Vuex、Pinia。通过学习这些内容,你将能够成为一名熟练的Vue.js开发者,并能够应用这些知识来构建复杂而高效的Web应用程序。点击订阅Vue专栏

JavaScript(ES6)专栏

在这里插入图片描述

JavaScript是一种广泛应用于网页开发和后端开发的脚本语言。它具有动态性、灵活性和易学性的特点,是构建现代Web应用程序的重要工具之一。在这个专栏中,我们将深入探讨JavaScript语言的基本语法、DOM操作、事件处理、异步编程以及常见算法和数据结构等内容。此外,我们还将介绍ES6(ECMAScript 2015)及其后续版本中引入的新特性,如箭头函数、模块化、解构赋值等。通过学习这些内容,你将能够成为一名熟练的JavaScript开发者,并能够应用这些知识来构建出高质量和可维护的Web应用程序。点击订阅JavaScript(ES6)专栏

这篇关于【JavaScript】Set、Map、WeakSet、WeakMap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/544040

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏