JavaScript的Set数据结构详解


Posted in Javascript onFebruary 18, 2022

1. 什么是 Set

Set 可以简单的看作是数学上的集合。

它是一系列无序,没有重复数值的数据集合。

2. Set 构造函数

对于 Set 的构造函数的参数,可以传递以下几种形式。

2.1) 数组

const s = new Set([1, 2, 1]);
console.log(s);

JavaScript的Set数据结构详解

这里传递了一个数组[1, 2, 1]作为参数,由于 Set 是无重复数值的集合,所以第三个 1 自动删除了。

2.2) 字符串

const s = new Set("Hello World!");
console.log(s);

JavaScript的Set数据结构详解

2.3) arguments

function fun() {
    const s = new Set(arguments);
    console.log(s);
}

fun(1, 2, 3);

JavaScript的Set数据结构详解

2.4) NodeList

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>set</title>
</head>
<body>
    <p>1</p>
    <p>2</p>
    <p>3</p>
    
    <script>
        const s = new Set(document.querySelectorAll('p'));
        console.log(s);
    </script>
</body>
</html>

JavaScript的Set数据结构详解

这里将三个p标签的引用放进了Set s中;

当我们要用的时候,就可以遍历这个 Set,然后分别将p标签的引用取出来,然后就可以对p标签进行修改了。

2.5)  Set

const s1 = new Set([1, 2, 3]);
const s2 = new Set(s1);
console.log(s2);

JavaScript的Set数据结构详解

这里相当于把s1复制过去,给了s2,不过它们不是同一个Set

console.log(s1 === s2);

JavaScript的Set数据结构详解

3. Set 的实例属性和方法

Set 的属性,有一个属性size,用来存储它的成员个数

const s = new Set([1, 2, 3]);
console.log(s.size);

JavaScript的Set数据结构详解

Set的方法

  • add

给 Set 中添加成员

const s = new Set([1, 2, 3]);
// 它的参数只能传一个
s.add(5);
console.log(s);
// 可以连缀 add
s.add(7).add(9);
console.log(s);

JavaScript的Set数据结构详解

  • delete

用来删除 Set 中的成员

const s = new Set([1, 2, 3]);
s.delete(2);
// 如果要删除的东西在 Set 中找不到,将什么也不会发生,也不会报错
s.delete(5);
console.log(s);

JavaScript的Set数据结构详解

  • has

用来判断 Set 是否含有某个成员

const s = new Set([1, 2, 3]);
console.log(s.has(1));
console.log(s.has(5));

JavaScript的Set数据结构详解

  • clear

将会删除 Set 的所有成员

const s = new Set([1, 2, 3]);
s.clear();
console.log(s);

JavaScript的Set数据结构详解

4. Set 的成员访问

它的成员访问要通过 forEach 方法实现,遍历 Set,它的遍历是按成员的添加顺序来进行遍历的。

它有两个参数,第一个参数为回调函数,第二个参数设定回调函数中this指向什么,即

s.forEach(回调函数, 回调函数的指向)

我们先来看第一个参数:

对于第一个参数回调函数,它有三个参数:

s.forEach(function(value, key, set){
	value 就是 Set 的成员
	在 Set 中,value 和 key 是相等的
	set 就是前面Set的本身,即这里 set === s
});

通过一个例子理解一下:

const s = new Set([1, 2, 3]);
s.forEach(function(value, key, set) {
    console.log(value, key, value === key);
    console.log(set, set === s);
});

JavaScript的Set数据结构详解

再来看第二个参数:

const s = new Set([1, 2, 3]);
s.forEach(function(value, key, set) {
    console.log(this);
}, document);

JavaScript的Set数据结构详解

5. Set 的注意事项

Set 对重复值的判断基本遵循严格相等===的判断

不过对于NaN,在 Set 中,NaN 等于 NaN

6. Set 的使用场景

数组去重

let arr = [1, 2, 1];
const s = new Set(arr);
arr = [...s];
// 也可以合成一句
// arr = [...new Set(arr)];
console.log(arr);

JavaScript的Set数据结构详解

字符串去重

let str = "11231131242";
const s = new Set(str);
str = [...s].join("");
// 也可以写成一句
// str = [...new Set(str)].join("");
console.log(str);

JavaScript的Set数据结构详解

存放 DOM 元素

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>set</title>
</head>
<body>
    <p>1</p>
    <p>2</p>
    <p>3</p>
    
    <script>
        const s = new Set(document.querySelectorAll('p'));
        s.forEach((elem) => {
            console.log(elem)
        });
    </script>
</body>
</html>

JavaScript的Set数据结构详解

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注三水点靠木的更多内容!

Javascript 相关文章推荐
Javascript 获取链接(url)参数的方法
Feb 15 Javascript
JavaScript 对象模型 执行模型
Dec 06 Javascript
JavaScript常用全局属性与方法记录积累
Jul 03 Javascript
jCallout 轻松实现气泡提示功能
Sep 22 Javascript
深入理解Javascript中的循环优化
Nov 09 Javascript
浅析Node.js 中 Stream API 的使用
Oct 23 Javascript
深入理解jQuery之防止冒泡事件
May 24 Javascript
正则表达式替换html元素属性的方法
Nov 26 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
Jan 11 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
Feb 01 Javascript
JS实现快递单打印功能【推荐】
Jun 21 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
Aug 11 Javascript
JS封装cavans多种滤镜组件
HTML+JS实现在线朗读器
Feb 15 #Javascript
js中Map和Set的用法及区别实例详解
Feb 15 #Javascript
canvas实现贪食蛇的实践
Vue自定义铃声提示音组件的实现
Jan 22 #Vue.js
JavaScript实例 ODO List分析
Jan 22 #Javascript
JavaScript ES6的函数拓展
Jan 18 #Javascript
You might like
php结合飞信 免费天气预报短信
2009/05/07 PHP
php防止伪造数据从地址栏URL提交的方法
2014/08/24 PHP
php实现修改新闻时删除图片的方法
2015/05/12 PHP
PHP安装memcached扩展笔记
2015/05/28 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
服务器安全设置的几个注册表设置
2007/07/28 Javascript
语义化 H1 标签
2008/01/14 Javascript
javascript Object与Function使用
2010/01/11 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
2012/10/12 Javascript
jQuery判断密码强度实现思路及代码
2013/04/24 Javascript
JQ获取动态加载的图片大小的正确方法分享
2013/11/08 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
微信小程序 template模板详解及实例
2017/02/21 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python协程用法实例分析
2015/06/04 Python
详解python中的Turtle函数库
2018/11/19 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
2020/05/03 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
META-INF文件夹中的MANIFEST.MF的作用
2016/06/21 面试题
模具专业推荐信
2013/10/30 职场文书
童装店创业计划书
2014/01/09 职场文书
校园摄影活动策划方案
2014/02/05 职场文书
先进工作者获奖感言
2014/02/08 职场文书
大学生创业事迹材料
2014/12/30 职场文书
学习心得体会
2019/06/20 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python