JavaScript Set对象
JavaScript Set对象
Set
用于存储任何类型的唯一值,无论是基本类型还是引用类型。
只有值没有键
严格类型检测存储,字符串数字不等同于数值型数字
存储的值具有唯一性
遍历顺序是添加的顺序,方便保存回调函数
其实Set
类型更多的是操作数据,而并非存储。
基础知识
声明定义
以下示例演示出如何使用Set
类型存储数据。
<script>
"use strict";
let set = new Set([1, "1", 1, 1, 1, 2, 3, 4, 5, "2"]) // 严格类型检测 1 != "1"
console.log(set instanceof Set); // true
console.log(set); // set(7) {1, "1", 2, 3, 4, 5, "2"}
</script>
添加元素
以下示例将演示如何将任意值元素添加进set
容器中,使用add()
方法进行添加元素的操作。
<script>
"use strict";
let set = new Set()
set.add(1);
set.add(["一","二","三"]);
set.add('1');
console.log(set); // Set(3) {1, Array(3), "1"} </script>
获取数量
使用size
属性获取set
容器中的元素个数。
<script>
"use strict";
let set = new Set()
set.add(1);
set.add(["一","二","三"]);
set.add('1');
console.log(set); // Set(3) {1, Array(3), "1"}
console.log(set.size); //
</script>
元素检测
使用has()
方法检测元素是否存在。
<script>
"use strict";
let set = new Set()
set.add(1);
set.add(["一", "二", "三"]);
set.add('1');
console.log(set); // Set(3) {1, Array(3), "1"}
console.log(set.has(["一", "二", "三"])); // 由于是不同的引用地址,故结果为 false let array = ["四", "五", "六"];
set.add(array)
console.log(set.has(array)); // 现在的引用地址一致,结果为 true
</script>
删除元素
使用delete()
方法删除单个元素,返回值为boolean
类型。
<script>
"use strict";
let set = new Set()
set.add(1);
set.add(["一", "二", "三"]);
set.add('1');
console.log(set); // Set(3) {1, Array(3), "1"} let res = set.delete(1); // 值类型,可以直接删除
console.log(res); // true 代表删除成功
res = set.delete(["一", "二", "三"]) // 引用类型,不可以直接删除
console.log(res); // false 代表删除失败
</script>
清空容器
使用clear()
方法可使set
容器清空。
<script>
"use strict";
let set = new Set()
set.add(1);
set.add(["一", "二", "三"]);
set.add('1');
set.clear();
console.log(set.size); //
</script>
数组转换
转换数据类型是为了更好的操纵数据,可以使用...
语法或者Array.form()
方法将set
转换为array
。
我们可以充分的结果set
去重的特性,以及array
丰富的操作方法来任意操纵我们的元素。
如下,我们将set
类型转换为了数组。
<script>
"use strict";
let set = new Set(["云崖先生", "男", 18])
let array = [...set];
console.log(array); // (3) ["云崖先生", "男", 18]
console.log(array instanceof Array); // true
</script>
将数组转换为set
,可以充分利用去重特性。
<script>
"use strict";
let array = new Array(1, 1, 1, 2, 2, 3, 4, 5);
array = new Set(array); // 去重
array = Array.from(array)
console.log(array instanceof Array); // true
console.log(array); // (5) [1, 2, 3, 4, 5]
</script>
遍历操作
迭代器创建
使用 keys()/values()/entries()
都可以返回迭代对象,因为set
类型只有值所以 keys
与values
方法结果一致。
<script> "use strict"; let set = new Set(["一", "二", "三", "四", "五"]); let iter_keys = set.keys(); let iter_values = set.values(); let iter_entries = set.entries(); console.log(iter_keys); console.log(iter_values); console.log(iter_entries); </script>
forEach
使用forEach
来循环set
容器。
<script> "use strict"; let set = new Set(["一", "二", "三", "四", "五"]); set.forEach(function (index, value) {
console.log(index, value);
}); </script>
for/of
也可使用for/of
进行循环。
<script> "use strict"; let set = new Set(["一", "二", "三", "四", "五"]); for (let i of set) { console.log(i);
} </script>
多集合操作
交集
交集代表set1
与set2
共有的部分。
<script> "use strict"; let set1 = new Set(["一", "二", "三", "四", "五"]);
let set2 = new Set(["三", "四", "五", "六", "七"]); let new_set = new Set( Array.from(set1).filter(function (value) {
return set2.has(value) })
); console.log(new_set); // Set(3) {"三", "四", "五"} </script>
差集
差集代表一个集合有,另一个集合没有的部分。
<script> "use strict"; let set1 = new Set(["一", "二", "三", "四", "五"]);
let set2 = new Set(["三", "四", "五", "六", "七"]); let new_set = new Set( Array.from(set1).filter(function (value) {
return !set2.has(value) })
); console.log(new_set); // Set(3) Set(2) {"一", "二"} </script>
并集
将两个集合合并成一个集合,多余的元素会被剔除,这就是并集。
<script> "use strict"; let set1 = new Set(["一", "二", "三", "四", "五"]);
let set2 = new Set(["三", "四", "五", "六", "七"]); let new_set = new Set([...set1,...set2]); console.log(new_set); // Set(7) {"一", "二", "三", "四", "五", "六", "七"} </script>
WeakSet
WeakSet
结构同样不会存储重复的值,它的成员必须只能是对象类型的值。
垃圾回收不考虑
WeakSet
,即被WeakSet
引用时引用计数器不加一,所以对象不被引用时不管WeakSet
是否在使用都将删除因为
WeakSet
是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )
遍历等操作也是因为弱引用,
WeakSet
结构没有keys()
,values()
,entries()
等方法和size
属性因为是弱引用所以当外部引用删除时,希望自动删除数据时使用
Weakset
声明定义
在 WeakSet
中只能保存容器类型的对象,即引用类型,不能保存值类型。
<script> "use strict"; let array = [1,2,3]; let dict = {"k1":"v1","k2":"v2"}; let set = new WeakSet([array,dict]); // 在 WeakSet中只能保存容器类型的对象,即引用类型。不能保存值类型 console.log(set); </script>
保存值类型会抛出异常。
<script> "use strict"; let array = [1,2,3]; let dict = {"k1":"v1","k2":"v2"}; let symbol = new Symbol(); // 值类型 let set = new WeakSet([array,dict,symbol]); // 在 WeakSet中只能保存容器类型的对象,即引用类型。不能保存值类型 console.log(set); // Uncaught TypeError: Symbol is not a constructor </script>
操作方法
方法 | 说明 |
---|---|
add() | 添加一个引用类型对象 |
delete() | 删除一个引用类型对象 |
has() | 判断是否存在一个引用类型对象 |
垃圾回收
对于标记清除法来说,存在于WeakSet
中的对象并不会增加引用计数,因此也被称之为弱引用。
当WeakSet
中对象的外部引用计数为0后,垃圾回收机制将清理该对象,并且WeakSet
容器内并不会保存该对象。
<script> "use strict"; let array = [1, 2, 3]; let dict = { "k1": "v1", "k2": "v2" }; let set = new WeakSet([array, dict]); console.log(set); // array还在里面 array = null; // 清理,引用计数为0 setInterval(() => { console.log(set); // array 不在了 }, 3000); </script>
作用详解
根据WeakSet
这个特性,我们可以用它来保存一下经常存取的数据。
当对象被删除后,我们不用管WeakSet
容器中是否含存有该数据。
示例如下:
将标签节点全部放入集合中,当在点击的时候添加类并且移出集合设置透明度,当再次点击的时候又将标签移入集合即可。
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="//at.alicdn.com/t/font_1953712_h1wr0ianmf5.css">
<style>
body {
display: flex;
justify-content: center;
align-items: center;
flex-flow: column wrap;
height: 100vh;
width: 100vw;
} input {
border: none;
height: 20px; } div {
border: 1px solid #ddd;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 10px;
padding: 0 5px;
width: 200px;
height: 30px; } div input {
flex: 1;
} div input:focus {
outline: none;
} div i {
background-color: rgba(0, 255, 96, 5);
padding: 2px;
border-radius: 10%; } i.iconfont {
font-size: 12px;
} .hidden {
opacity: .5;
}
</style>
</head> <body>
<div>
<input type="text"><i class="iconfont icon-shanchu"></i>
</div>
<div>
<input type="text"><i class="iconfont icon-shanchu"></i>
</div>
<div>
<input type="text"><i class="iconfont icon-shanchu"></i>
</div>
<div>
<input type="text"><i class="iconfont icon-shanchu"></i>
</div> </body>
<script> "use strict"; let divs = document.querySelectorAll("div"); let set = new WeakSet([...divs]); divs.forEach(function (ele) { ele.childNodes[2].addEventListener("click", function (param) {
if (set.has(this.parentNode)) {
set.delete(this.parentNode);
this.parentNode.classList.add('hidden');
}
else {
set.add(this.parentNode);
this.parentNode.classList.remove("hidden");
} })
}) </script> </html>
JavaScript Set对象的更多相关文章
- javascript 全局对象--w3school
JavaScript全局对象 1. decodeURI()解析某个编码的URI. 2.decodeURInComponent()解析一个编码的URI组件. 3.encodeURI()把字符串编码为U ...
- JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString
JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString 如下示例: 直接写的a1就是一个Json对象,a2 就是一个Json对象字符串; 通 ...
- 从零构建JavaScript的对象系统
一.正统的类与继承 类是对象的定义,而对象是类的实例(Instance).类不可直接使用,要想使用就必须在内存上生成该类的副本,这个副本就是对象. 以Java为例: public class Grou ...
- 关于javascript自定义对象(来自网络)(最近几天不会的)
javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放在构造方法里面定义 优点:动态的传递参数 缺点:每创建一个对象就会创建相同的方法函数对象,占用大量内存 funct ...
- 据说每个大牛、小牛都应该有自己的库——JavaScript原生对象拓展
在据说每个大牛.小牛都应该有自己的库——框架篇中我扬言要做个小牛,没想到一天没更新,小伙儿伴们就戏谑的问我,油哥是不是要太监了?其实事情是这个样子的,这不是太监的节奏,一是,关于写个自己的库的想法由来 ...
- JavaScript RegExp 对象
JavaScript RegExp 对象 RegExp 对象用于规定在文本中检索的内容. 什么是 RegExp? RegExp 是正则表达式的缩写. 当您检索某个文本时,可以使用一种模式来描述要检索的 ...
- JavaScript String 对象
JavaScript String 对象 String 对象 String 对象用于处理文本(字符串). String 对象创建方法: new String(). 语法 var txt = new S ...
- JavaScript Math 对象
JavaScript Math 对象 Math 对象 Math 对象用于执行数学任务. Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(). 语法 var ...
- JavaScript Number 对象
JavaScript Number 对象 Number 对象 Number 对象是原始数值的包装对象. Number 创建方式 new Number(). 语法 var num = new Numbe ...
- JavaScript Array 对象
JavaScript Array 对象 Array 对象 Array 对象用于在变量中存储多个值: var cars = ["Saab", "Volvo", & ...
随机推荐
- 小白写了一堆if-else,大神实在看不下去了,竟然用策略模式直接摆平了
这里涉及到一个关键词:策略模式,那么到底什么是策略模式呢?本文就来好好给大家讲讲策略模式,大家可以带着如下几个问题来阅读本文: 1. 如何通过策略模式优化业务逻辑代码(可以根据自己从事的工作思考) ...
- mdcChipSet中mdcChip事件selectedChange
项目中遇到一个问题,由于每个mdcChip上都有一个change事件,所以想在change事件中操作执行最新被选中的item时,就会遇到一些麻烦. 如何解决呢? 全局设置一个变量,例如:mark 然后 ...
- 洛谷 P4408 [NOI2003]逃学的小孩
题目传送门 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚, ...
- sql语句-CASE WHEN用法详解
当我们需要从数据源上 直接判断数据显示代表的含义的时候 ,就可以在SQL语句中使用 Case When这个函数了. Case具有两种格式.简单Case函数和Case搜索函数. 第一种 格式 : 简单C ...
- 从零开始实现multipart/form-data数据提交
在HTTP服务应用中进行数据提交一般都使用application/json,application/x-www-form-urlencoded和multipart/form-data这几种内容格式.这 ...
- vue重置data里的值
this.$options.data() 这个可以获取原始的data值,this.$data 获取当前状态下的data,拷贝重新赋值一下就行了. Object.assign(this.$data, t ...
- MySQL后记
MySQL后记 这篇博客的目的是记录一些容易被忽略的MySQL的知识点,以及部分pymysql模块的注意点. MySQL中的DDL与DML DDL:数据定义语言(Data Definition Lan ...
- 数据可视化之powerBI基础(六)Power BI的“问答”,你用过吗?
https://zhuanlan.zhihu.com/p/64412190 本文来自星球嘉宾"海艳"的分享,关于Power BI的问答功能以及各项细节,海艳详细为大家逐一介绍,下 ...
- Django之实现登录随机验证码
登录验证码是每个网站登录时的基本标配,网上也有很多相应的文章, 但是从生成验证码到 应用到自己的网站上的全步骤,并没有看到很多, 为了节约大家的时间,我把整体步骤写下来, 即拿即用哈 1. 生成随机验 ...
- java学习第七天2020/7/12
一. java继承使用的关键字是 extend class 子类 extends 父类{} 举一个类的例子: public class person { public String name; pu ...