JavaScript Set 必备指南:深入理解 Set 的特性和方法

news2024/11/23 19:56:54

image.png

一. 了解 Set

1. 概念和用途

Set 是 JavaScript 中的一种集合(collection)数据结构,它类似于数组,但是集合中的元素是唯一的,不允许重复。Set 提供了一种存储不重复数值或对象的机制,可以用于存储一组唯一的值,并且拥有一些方便的方法来操作这些值。

2. 为什么使用 Set

  • 唯一性: Set 中的元素是唯一的,不允许重复。这使得 Set 成为一种方便的去重工具,可以快速地剔除数组或其他数据结构中重复的元素。

  • 性能优势: 由于 Set 的内部实现使用了哈希表等高效数据结构,因此在查找和插入元素时具有较好的性能,特别是在处理大量数据时,使用 Set 可以提高处理效率。

  • 丰富的方法: Set 提供了丰富的操作方法,如添加元素、删除元素、查找元素、集合运算等,使得开发者能够方便地对集合进行操作。

JavaScript 的 Set 数据结构提供了一种高效、方便且具有唯一性的集合存储机制,适用于处理需要唯一性数据的场景,例如去重、标记已访问元素等。

二. 创建 Set

1. 使用构造函数创建 Set

在 JavaScript 中,您可以使用 Set 构造函数来创建一个新的 Set 实例。具体操作如下:

// 创建一个空的 Set
let mySet = new Set();

// 创建包含初始元素的 Set
let initialSet = new Set([1, 2, 3, 4, 5]);

2. 添加元素到 Set

可以使用 add 方法将元素添加到 Set 中,确保每个元素都是唯一的,不会重复添加:

// 创建一个空的 Set
let mySet = new Set();

// 添加元素到 Set
mySet.add(1);
mySet.add(2);
mySet.add(3);

3. 从数组创建 Set

可以使用数组的元素来创建一个 Set 实例,数组中的重复元素将被自动去重:

// 创建一个包含重复元素的数组
let duplicatesArray = [2, 3, 4, 4, 5, 5];

// 使用数组来创建 Set,同时来去重
let uniqueSet = new Set(duplicatesArray);
// 此时 uniqueSet 为 {2, 3, 4, 5}

通过上述方法,您可以很容易地创建 Set 并向其中添加元素,也可以通过数组快速地创建并去重一个 Set 对象。

三. Set 的特性

Set 是一种数据结构,它包含一组唯一且无序的值。在 JavaScript 中,Set 以对象的形式存在,其中的值只能出现一次。以下是 Set 的一些特性说明:

1. 唯一性

Set 中的值必须是唯一的。如果将相同的值加入 Set 多次,只会存储一次这使得 Set 成为去重数据的想结构。

let uniqueSet = new Set();
uniqueSet.add(1);
uniqueSet.add(2);
uniqueSet.add(1);
console.log(uniqueSet); // 输出: Set(2) {1, 2}

image.png

2. 无序性

在 Set 中,值的排列顺序不是照插入的顺序来决定的。这意味着无法依赖 Set 的顺序性进行操作。

let unorderedSet = new Set();
unorderedSet.add(3);
unorderedSet.add(1);
unorderedSet.add(2);
console.log(unorderedSet); // 输出: Set(3) {3, 1, 2}

image.png

3. 可迭代性

Set 是可通过迭代器进行遍历,可以使用 for... 循环或者 Array.from 方法将 Set 转换数组。

let iterableSet = new Set([1, 2, 3]);
for (let item of iterableSet) {
  console.log(item);
}
// 输出:
// 1
// 2
// 3

image.png

4. 长度属性

Set 实例有 size 属性,表示 Set 中值的数量。

let sizedSet = new Set([1, 2, 3, 4, 5]);
console.log(sizedSet.size); // 输出: 5

image.png

5. 添加和删除

Set 具有添加值的 add 方法,移值的 delete 方法,以及清空所有值的 clear 方法。

let addDeleteSet = new Set();
addDeleteSet.add(1);
addDeleteSet.add(2);
console.log(addDeleteSet); // 输出: Set(2) {1, 2}
addDeleteSet.delete(1);
console.log(addDeleteSet); // 输出: Set(1) {2}
addDeleteSet.clear();
console.log(addDeleteSet); // 输出: Set(0) {}

image.png

6. 判断值是否存在

可以使用 has 方法来检查某一特定值是否存在 Set 中。

let hasSet = new Set([1, 2, 3]);
console.log(hasSet.has(2)); // 输出: true
console.log(hasSet.has(4)); // 输出: false

image.png

7. 引用

在 Set 中存储的值弱引用的,意味着如果没有其他引用指向 Set 中的某个值,那么这个值可能会被垃圾回收。

总的来说 Set 是一种非常有用的数据结构,特别适用于需要存储唯值并且不需要考虑顺序的情况。它的高效去重能力和集合操作特性,使得它在实际开发中有着广泛的应用。

四. Set 的方法

1. 添加元素:add()

使用 add() 方法向 Set 中添加新的元素。

let mySet = new Set();
mySet.add(1);
mySet.add(2);
mySet.add(3);

2. 删除元素:delete()

使用 delete() 方法从 Set 中删除指定的元素。

mySet.delete(2); // 从 Set 中删除元素 2

3. 检查元素是否存在:has()

使用 has() 方法检查指定元素是否存在于 Set 中。

mySet.has(1); // 检查 Set 中是否存在元素 1,返回结果为 true 或

4. 清空 Set:clear()

使用 clear() 方法清空 Set 中所有元素。

mySet.clear(); // 清空 Set

5. 获取 Set 的大小:size 属性

使用 size 属性获取 Set 内元素数量。

let setSize = mySet.size; 获取 Set 的大小

掌握以上的这些方法能够帮助你在开发过程中,熟练的对 Set 进行元素的增查操作,以及 Set 的大小信息。

五. 注意事项

通过上面的了解,我们基本认识到了 Set 的特性以及最常用的使用方法,但是在使用 Set 时,有几个注意事项需要我们提前了解一下,下面是我总结的使用 Set 时需要注意的几个事项:

1. 值的唯一性

Set 中的值必须是唯一的,相同的值不会被重复存储。这意味着当你向一个 Set 中添加已存在的值时,不会有任何变化。因此,要确保你向 Set 添加的值是唯一的,否则可能会导致意外的结果。

2. 对象引用

Set 存储的是值的引用,而不是复制。这意味着当你向 Set 添加一个对象时,实际存储的是对象的引用而不是对象本身。这可能会导致一些意想不到的结果,特别是在修改对象时。请注意在修改对象后检查 Set 中的值是否也会被修改。

3. NaN 的处理

在 Set 中,NaN 被视为是相同的值,即 NaN 只能存储一次。这可能与你的预期不同,因为在其他地方 NaN 通常被视为是不相同的值。所以,确保在使用 Set 存储 NaN 时,不会出现重复的情况。

const set = [...new Set([Number("one"), Number("two"), "one", "two"])];
console.log(set);

image.png

4. 不支持索引访问

Set 不支持通过索引来访问值,因为它的值是无序的。如果你需要通过索引访问值,请考虑使用 Array。

5. 类型转换

当我们向 Set 中添加值的时候,不会进行类型转换,即 '1'和 1 是不相同的

const set = [...new Set([1, "1"])];
console.log(set);

image.png

在使用 Set 时需要针对具体场景进行合理的选择和注意。尽管 Set 在去重和集合操作等方面非常实用,但也需要注意它的特性和限制,以便正确使用和处理数据。

六. 总结

通过对本文的学习,我们都知道了 Set 是 JavaScript 中的一种数据结构,它提供了一种用于存储唯一值的机制,同时还具备高效的数据操作能力。

首先,我们了解了 Set 的核心特性:唯一性无序性可迭代性以及长度属性等。这些特性使得 Set 成为一个强大的去重工具,并且具备高效的集合操作能力。

紧接着,我们逐一介绍了 Set 的各种方法的使用。我们学习了如何向 Set 中添加和删除值,通过 adddeleteclear 方法完成这些操作。我们还了解了如何判断某个值是否存在于 Set 中,通过 has 方法可以快速判断。

在实际开发中,Set 有着广泛的应用。无论是从一个数组中快速去重重复的值,还是利用集合操作来处理数据,Set 都能提供便利且高效的解决方案。

总而言之,Set 是 JavaScript 中的一个重要而强大的数据结构。通过深入理解 Set 的特性和方法,我们能够更好地应用它来解决实际问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2208311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【03】手把手教你0基础部署SpringCloud微服务商城教学-Docker前置篇(附Linux虚拟机配置调试及Docker安装全流程)

前文回顾:【02】手把手教你0基础部署SpringCloud微服务商城教学-Mybatis篇(下) 首先我们第一次看见这个东西,第一步就是需要知道它到底是用来干什么的? 简单来说,Docker就是一个快速构建、运行、管理应用的…

K8s-services+pod详解1

一、Service 我们能够利用Deployment创建一组Pod来提供具有高可用性的服务。 虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题: Pod IP 会随着Pod的重建产生变化Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问 这样对于访问这…

【干货】2024新学期期中考试,老师成绩发布工具

老师们别再为期中发成绩发愁了,我给各位带来了一个解决方案——易查分小程序,它可以将彻底改变您发布成绩的方式!一分钟发布期中考试成绩。不管您是教育界的新手还是老手,易查分都能成为您的得力助手。它的界面既美观又实用&#…

大数据毕业设计选题推荐-音乐数据分析系统-音乐推荐系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

一些近期值得关注的存储和备份潜在漏洞

时刻保持警惕,及时、适时地检测暴露于安全建议和警告的相关设备,这一点对企业数据安全再重要不过了。 Continuity调研指出了最近几个月,存储和备份解决方案中存在的、可被攻击者发现和利用的潜在漏洞,包括: Veeam Ba…

YOLOv10改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

必读内容📖 如何寻找创新点?为什么要使用这个模块?如何才能提升模型的精度?这是贯穿我们研究始终的问题。创新点在这个专栏中我已经整理好了,这已经省去了大部分时间,但是当我们使用这些新的模块去优化已有…

LDR6500取电诱骗协议芯片:革新电子设备充电体验

在当今电子设备日新月异的时代,Type-C接口以其高效、便捷的特点迅速成为市场主流。这一接口不仅支持高速数据传输,还实现了正反插拔的便利性,极大地提升了用户体验。然而,在Type-C接口的广泛应用背后,一个关键的技术组…

Java日常开发小结-01

一、fastjson2 FastJson对于json格式字符串的解析主要用到三个类1.JSON&#xff1a;解析器&#xff0c;用于JSON格式字符串与JSON对象及javaBean之间的转换 2.JSONObject&#xff1a;json对象 3.JSONArray&#xff1a; json数组对象 1.1、引入依赖 <dependency><gr…

雷池社区版本SYSlog使用教程

雷池会对恶意攻击进行拦截&#xff0c;但是日志都在雷池机器上显示 如何把日志都同步到相关设备进行统一的管理和分析呢&#xff1f; 如需将雷池攻击日志实时同步到第三方服务器, 可使用雷池的 Syslog 外发 功能 启用 Syslog 外发 进入雷池 系统设置 页面, 配置 Syslog 设置…

基于单片机的公交车自动报站器设计

本设计是以STM32单片机为控制核心的公交车自动报站系统&#xff0c;该系统的主要构成模块有&#xff1a;控制核心模块、GPS模块、温度模块、语音模块、按键控制模块和显示模块。采用点阵显示屏&#xff0c;可自动显示下一站&#xff0c;使用OLED显示器显示温度和经纬度&#xf…

免费使用Cursor, 切换DeepSeek模型

1. 选择设置 直接点击右上角的齿轮图标 或 者通过文件-->首选项-->Cursor Settings 2. 添加模型 点击Models→Add model 添加模型→添加Deepseek的模型名称&#xff1a;deepseek-coder 和 deepseek-chat→注意&#xff1a;模型名一定不能输错&#xff01;&#xff…

2024年区块链钱包现状与未来趋势分析

钱包作为Web3世界的入口&#xff0c;充当了用户与区块链应用交互、管理资金和传递信息的关键工具。随着区块链技术的发展&#xff0c;钱包生态系统日益多样化&#xff0c;涌现出大量不同类型的解决方案。这些解决方案不仅极大地改善了用户体验&#xff0c;还推动了区块链技术和…

鸿蒙HarmonyOS开发:应用权限的基本概念及如何申请应用权限详细介绍

文章目录 一、访问控制二、应用权限1、应用权限管控2、权限使用的基本原则3、授权方式4、权限等级 三、申请应用权限1、选择申请权限的方式2、声明权限3、声明样例4、二次向用户申请授权5、具体实现示例6、效果展示 四、应用权限列表1、system_grant&#xff08;系统授权&#…

基于FPGA的以太网设计(二)

一.以太网硬件架构概述 前文讲述了以太网的一些相关知识&#xff0c;本文将详细讲解以太网的硬件架构 以太网的电路架构一般由MAC、PHY、变压器、RJ45和传输介质组成&#xff0c;示意图如下所示&#xff1a; PHY&#xff1a;Physical Layer&#xff0c;即物理层。物理层定义了…

三、异步加载场景

一、加载场景实现 1、加载进度条方法 在加载场景这个预制体面板上挂在一个代码 LoadingWnd 先对组件进行声明包括&#xff08;一个进度条上的文字、提示组件&#xff08;进度条位置&#xff09;、进度点、进度百分比&#xff09; 使用进度条&#xff0c;首先要初始化一下&am…

使用Docker搭建WAF-开源Web防火墙VeryNginx

1、说明 VeryNginx 基于 lua_nginx_module(openrestry) 开发,实现了防火墙、访问统计和其他的一些功能。 集成在 Nginx 中运行,扩展了 Nginx 本身的功能,并提供了友好的 Web 交互界面。 文章目录 1、说明1.1、基本概述1.2、主要功能1.3、应用场景2、拉取镜像3、配置文件4、…

SVM及其实践2 --- 对典型数据集的多分类实践

说明 本文为SVM系列的第二篇文章&#xff0c;主要是基于SVM对两份公开数据集的分类实践。建议读者在阅读本文前先看看本系列的第一篇博文[1]: SVM及其实践1 --- 概念、理论以及二分类实践-CSDN博客 Blog 2024.10.6 本文第一次撰写 目录 说明 目录 一、Iris数据集以及基于S…

Qt-链接数据库可视化操作

1. 概述 Qt 能够支持对常见数据库的操作&#xff0c;例如&#xff1a; MySQL、Oracle、SqlServer 等等。 Qt SQL模块中的API分为三层&#xff1a;驱动层、SQL接口层、用户接口层。 驱动层为数据库和SQL接口层之间提供了底层的桥梁。 SQL接口层提供了对数据库的访问&#xff0…

【源码+文档+调试讲解】基于安卓的小餐桌管理系统springboot框架

摘 要 相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低运营人员成本&#xff0c;实现了小餐桌的标准化、制度化、程序化的管理&#xff0c;有效地防止了小餐桌的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时、准确地查询和修…

vue+ElementUI—实现基础后台管理布局(sideBar+header+appMain)(附源码)

后台管理的模板很多&#xff0c;vue本身就提供了完整的vue-template-admin&#xff0c;vue-admin-beautiful等后台管理系统化框架&#xff0c;但是这些框架正是因为成体系而显得繁重。假如你想搭建一个静态的后台管理模板页面和几个单独的菜单页面&#xff0c;直接就上框架是否…