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 相关文章推荐
ext读取两种结构的xml的代码
Nov 05 Javascript
jQuery的.live()和.die() 使用介绍
Sep 10 Javascript
jQuery弹性滑动导航菜单实现思路及代码
May 02 Javascript
jQuery trigger()方法用法介绍
Jan 13 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
Jan 23 Javascript
jQuery ajax MD5实现用户注册即时验证功能
Oct 11 Javascript
NODE.JS跨域问题的完美解决方案
Oct 20 Javascript
利用jQuery解析获取JSON数据
Apr 08 jQuery
Node.js Mongodb 密码特殊字符 @的解决方法
Apr 11 Javascript
浅谈Webpack 是如何加载模块的
May 24 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
Sep 03 Javascript
关于自定义Egg.js的请求级别日志详解
Dec 12 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多例模式介绍
2013/06/24 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
php浏览历史记录的方法
2015/03/10 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
jquery 插件学习(二)
2012/08/06 Javascript
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
JavaScript Promise启示录
2014/08/12 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
在JSP中如何实现MD5加密的方法
2016/11/02 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
python超简单解决约瑟夫环问题
2015/05/12 Python
python Spyder界面无法打开的解决方法
2018/04/27 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
在django中自定义字段Field详解
2019/12/03 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
欧尚俄罗斯网上超市:Auchan俄罗斯
2018/05/03 全球购物
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
老干部工作先进事迹
2014/08/17 职场文书
中学生民族团结演讲稿
2014/08/27 职场文书
感谢信的格式
2015/01/21 职场文书
工作简历自我评价
2015/03/11 职场文书
招商银行工作证明
2015/06/17 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书