ES6系列_11之Set和WeakSet数据结构
一、Set
1.Set是什么?
Set是ES6 提供的一种新的数据结构。类似于数组。
2.Set能解决什么问题
Set和Array 的区别是Set不允许内部有重复的值,如果有只显示一个,相当于去重。
3.怎么使用Set相关东西
Set 函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。

(1)Set的声明
let setArr = new Set(['1','2','3']);
console.log(setArr);//Set {"1", "2", "3"}
(2)Set值的增删查
追加add:
在使用Array的时候,使用push进行追加值,那Set稍有不同,它使用add进行追加。
let setArr = new Set(['1','2','3']);
console.log(setArr);//Set {"1", "2", "3"} setArr.add('4')
console.log(setArr);//Set {"1", "2", "3","4"}
删除delete:
let setArr = new Set(['1','2','3']);
console.log(setArr);//Set {"1", "2", "3"} setArr.delete("1") console.log(setArr);//Set {"2", "3"}
查找has:
用has进行值的查找,返回的是true或者false。
let setArr = new Set(['1','2','3']);
console.log(setArr);//Set {"1", "2", "3"} console.log(setArr.has("1"))//true console.log(setArr.has("0"))//false
删除clear:
清空所有
let setArr = new Set(['1','2','3']);
console.log(setArr);//Set {"1", "2", "3"} setArr.clear() console.log(setArr)//{}
set的循环 for…of…循环:
let setArr = new Set(['1','2','3']);
console.log(setArr);//Set {"1", "2", "3"} for (let item of setArr){
console.log(item); //1,2,3
}
forEach循环:
let setArr = new Set(['1','2','3']); setArr.forEach((value)=>console.log(value)) //1,2,3
size属性:
size属性可以获得Set值的数量。
let setArr = new Set(['1','2','3']); console.log(setArr.size)//
二、WeakSet
WeakSet 结构与 Set 类似,也是不重复的值的集合。但是,它与 Set 有两个区别。
首先,WeakSet 的成员只能是对象,而不能是其他类型的值。
其次,WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。
因此WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失。
ES6 规定 WeakSet 不可遍历。
(1)WeakSet的声明以及赋值
声明只能先new一个空对象,然后在使用add方法将一个已定义的对象添加到其中。
let weakObj=new WeakSet();
let obj={a:'1',b:'2'}
weakObj.add(obj);
console.log(weakObj);
输出结果为:

WeakSet里边的值也是不允许重复的,比如:
let weakObj=new WeakSet();
let obj={a:'1',b:'2'}
let obj1=obj
weakObj.add(obj);
weakObj.add(obj1)
console.log(weakObj);
输出结果为:

实际为对象指向同一个地址,当对象不指向同一个地址,即使两个对象里面的值,相同也是可以添加到WeakSet里的。比如:
let weakObj=new WeakSet();
let obj={a:'1',b:'2'}
let obj1={a:'1',b:'2'}
weakObj.add(obj);
weakObj.add(obj1)
console.log(weakObj);
输出的结果为:

总结:在实际开发中Set用的比较多,WeakSet用的并不多,但是WeakSet对传入值必须是对象作了很好的判断。
ES6系列_11之Set和WeakSet数据结构的更多相关文章
- Set 和 WeakSet 数据结构
Set 和 WeakSet 数据结构是ES6新增. 它与数组非常相似,但是Set数据结构的成员都是唯一的. 特别说明:Set 中只能添加一个NaN 一.Set 数据结构: var set = new ...
- 大白话,讲编程之《ES6系列连载》汇总
如果你经历过2,3年前的前端开发,你一定感受过兼容IE6,7的痛苦,一定用过网页三剑客的dreamweaver编写html,面试的时候面试官一定会问你:会用PS切图吗? 刚开始的时候你发现,web前端 ...
- [js高手之路] es6系列教程 - 对象功能扩展详解
第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...
- [js高手之路] es6系列教程 - 迭代器,生成器,for...of,entries,values,keys等详解
接着上文[js高手之路] es6系列教程 - 迭代器与生成器详解继续. 在es6中引入了一个新的循环结构for ....of, 主要是用来循环可迭代的对象,那么什么是可迭代的对象呢? 可迭代的对象一般 ...
- ES6 系列之 Babel 是如何编译 Class 的(下)
前言 ES5 寄生组合式继承 function Parent (name) { this.name = name; } Parent.prototype.getName = function () { ...
- es6系列-变量声明
es6系列所有文章都是阅读阮一峰老师的<ES6标准入门>(第2版)所做的读书笔记.方便日后查阅相关基础知识. git地址: https://github.com/rainnaZR/es6- ...
- ES6 系列之异步处理实战
前言 我们以查找指定目录下的最大文件为例,感受从 回调函数 -> Promise -> Generator -> Async 异步处理方式的改变. API 介绍 为了实现这个功能,我 ...
- [ES6系列-01]Class:面向对象的“新仇旧恨”
[原创]CoderPower 大家好,这里是码路工人有力量,我是码路工人,你们是力量. 这是公众号(码路工人有力量)开通后的第二篇,写得还是有待改进吧.这次准备写一个关于ES6基础的短文系列,努力尽快 ...
- ES6系列之项目中常用的新特性
ES6系列之项目中常用的新特性 ES6常用特性 平时项目开发中灵活运用ES6+语法可以让开发者减少很多开发时间,提高工作效率.ES6版本提供了很多新的特性,接下来我列举项目中常用的ES6+的特性: l ...
随机推荐
- jquery和dom对象相互转化的方法
jQuery对象转成DOM对象: 两种转换方式将一个jQuery对象转换成DOM对象:[index]和.get(index); (1)jQuery对象是一个数据对象,可以通过[index]的方法,来得 ...
- HDU1698 线段树入门之区间修改/查询(lazy标记法)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 4826 (分类DP)
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- ES6学习笔记(一)——扩展运算符和解构赋值
前言 随着前端工程化的快速推进,在项目中使用ES6甚至更高的ES7等最近特性早已不是什么新鲜事.之前还觉得既然浏览器支持有限,那了解一下能看懂就好,然而仅仅了解还是不够的,现在放眼望去,那些成熟框架的 ...
- Vue.js学习笔记:在元素 和 template 中使用 v-if 指令
f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- Android Studio 编译报错:Process 'command 'D:\SDK\AS\sdk\build-tools\23.0.0\aapt.exe'' finished with non-zero exit value 1
AGPBI: {"kind":"error","text":"No resource identifier found for a ...
- protel 99se 全部焊盘和过孔补泪滴,很多都是失败的,对板子有影响吗?补泪滴的作用?
泪滴 是焊盘与导线或者是导线与导孔之间的滴装连接过度,设置泪滴的目的是在电路板受到巨大外力的冲撞时,避免导线与焊盘或者导线与导孔的接触点断开,另外,设置泪滴也可使PCB电路板显得更加美观.te ...
- LaTeX 之 \label 的运用
LaTeX 之 \label 的运用 前言 大部分的LaTex教程里面都会提到 \label 的标记功能,而如果入门时就玩耍过WinEdt的同学在工具栏上点击各种环境的时候就会发现\label这个东东 ...
- CIE-LUV是什么颜色特征
参考文献:维基百科 a simple-to-compute transformation of the 1931 CIE XYZ color space, but which attempted pe ...
- 在Linux中批量修改字符串的命令
昨天一个朋友忽然问我,在Linux下如何批量修改字符串,当时瞬间懵逼了,完全想不起来....... 今天特意的重温了一下Linux下的一些常用命令,并将这个遗忘的批量修改字符串的命令记录下来(资料来自 ...