Set

其实2016年就看过阮大神的ECMAScript 6 入门,当时看了Set之后,大致看懂了,但事实上根本没有理解Set到底是什么,所以更记不住,平时做项目大多用到的还是ES5的传统写法,以至于始终觉得Set很神秘。

上上周闲来无事,翻了翻《数据结构与算法JavaScript描述》,第9章讲的是集合,很好理解,跟高中数学课上学的集合差不多,可以存一些数据,但是集合中的每个元素都是唯一的(不重复),然后就是交集、并集、补集、全集、子集的一些概念,都很好理解。

今天又回过头来看阮神的ES6入门Set,突然恍然大悟!原来神秘的Set,其实就是集合而已!JS中也原生实现了这种数据结构!哈哈哈哈哈

知识点

下面简单梳理记录主要知识点,不完善之处后续慢慢补充。

  • Set类似于数组,其成员的值唯一
  • Set是一个构造函数,用来生成Set数据结构。就像Array是个构造函数一样
  • Set函数可以接受具有iterable接口的其他数据结构作为参数,用来初始化
  • 在Set内部,两个NaN是相等的,不能重复add
  • 向Set加入值的时候,不会进行类型转换,所以5"5"是两个不同的值。

PS:

Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===),主要的区别是NaN等于自身,而精确相等运算符认为NaN不等于自身。

初始化Set的一些代码示例

// 示例一
const set = new Set([1, 2, 3, 2, 4, 5, 3, 4, 6]);
[...set]
// [1, 2, 3, 4, 5, 6] // 示例二
const set = new Set(document.querySelectorAll('div'));
set.size // 11 // 类似于
const set = new Set();
document.querySelectorAll('div').forEach(div => set.add(div));
set.size // 11 // 数组去重
[...new Set([3, 2, 5, 3, 1, 6, 2, 7])] // [3, 2, 5, 1, 6, 7]

Set 实例的属性和方法

属性:

  • Set.prototype.constructor:构造函数,默认就是Set函数
  • Set.prototype.size:返回Set实例的成员总数

操作方法(用于操作数据):

  • add(value):添加某个值,返回Set结构本身
  • delete(value):删除某个值,返回一个布尔值,表述删除是否成功
  • has(value):返回一个布尔值,表示该值是否为Set的成员
  • clear():清除所有成员,没有返回值

代码示例如下:

let s = new Set();
s.add(1).add(1).add(2).add(3); s.size; // 3 s.has(1) // true
s.has(2) // true
s.has(4) // false s.delete(2) // true s.clear()

ps: Array.from方法可以将Set 结构转为数组(Array.from方法用于将两类对象转为真正的数组:类数组对象和可遍历对象)

实现数组去重

function dedupe(array) {
return Array.from(new Set(array))
}

遍历方法(用于遍历成员):

  • keys():返回键名的遍历器
  • values():返回键值的遍历器
  • entries():返回键值对的遍历器
  • forEach():使用回调函数遍历每个成员

    PS:Set 的遍历顺序就是插入顺序。这个特性有时非常游泳,比如使用Set保存一个回调函数列表,调用时就能保证按照添加顺序调用。

未完待续。。。。。。

ES6--Set之再理解的更多相关文章

  1. ES6之let(理解闭包)和const命令

    ES6之let(理解闭包)和const命令 最近做项目的过程中,使用到了ES6,因为之前很少接触,所以使用起来还不够熟悉.因此购买了阮一峰老师的ES6标准入门,在此感谢阮一峰老师的著作. 我们知道,E ...

  2. JavaScript es6 class类的理解。

    本着互联网的分享精神,在本篇文章我将会把我对JavaScript  es6 class类的理解分享给大家. JavaScript 类主要是 JavaScript 现有的基于原型的继承的语法糖. 类语法 ...

  3. SVM问题再理解与分析——我的角度

    SVM问题再理解与分析--我的角度 欢迎关注我的博客:http://www.cnblogs.com/xujianqing/ 支持向量机问题 问题先按照几何间隔最大化的原则引出他的问题为 上面的约束条件 ...

  4. 再理解HDFS的存储机制

    再理解HDFS的存储机制 1. HDFS开创性地设计出一套文件存储方式.即对文件切割后分别存放: 2. HDFS将要存储的大文件进行切割,切割后存放在既定的存储块(Block)中,并通过预先设定的优化 ...

  5. SpringBoot-04-自动配置原理再理解

    4. 自动配置原理再理解 ​ 配置文件到底能写什么?怎么写?SpringBoot官方文档有大量的配置,但是难以全部记住. 分析自动配置原理 ​ 官方文档 ​ 我们以HttpEncodingAutoCo ...

  6. [每日一题]面试官问:谈谈你对ES6的proxy的理解?

    [每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  7. ES6系列-什么是ES6?新手应该怎么理解

    ECMAScript 是什么 很多初学者都很困惑,ECMAScript是什么?它跟JavaScript有什么关系? 大家注意到了吗?从题目中我们就可以看出来了,ECMAScript是JavaScrip ...

  8. Community Value再理解

    其实之前写“从香港机房引入google/bitbucket路由”的时候,对community value的了解还并不深入,对Juniper default BGP export/import poli ...

  9. Python无类再理解--metaclass,type

    上次理解过一次,时间久了,就忘了.. 再学习一次.. http://blog.jobbole.com/21351/ ======================= 但是,Python中的类还远不止如此 ...

  10. 用grunt进行ES6转换,再用uglify压缩所有js实例

    1.首先安装node.js 去官网下载exe执行文件安装即可,安装完成后自带有npm管理. 2.安装grunt CLI 在项目根文件夹下执行如下代码: npm install -g grunt-cli ...

随机推荐

  1. 数组:获取数组中最后一个数据end()函数

    今天来学习一下end()函数 1.案例:直接获取数组中最后一个数据 代码部分 结果: 2.案例:从url中获取最后一个数据 代码部分: 结果: 总结: 1.有时候我们需要去获取数据库中,id最大的那个 ...

  2. March 13 2017 Week 11 Monday

    A warm smile is the universal language of kindness. 温暖的笑容是善意的通用语. Face comes from the heart. Just sm ...

  3. ABAP正则表达式 vs SPLIT INTO

    需求: 把如下通过"/"连接起来的三个字符串分别解析出来. 传统的做法见下图第98行的function module SKWF_UTIL_IO_FIND_BY_KEY: 这个fun ...

  4. python入门23 pymssql模块(python连接sql server增删改数据 )

    增删改数据必须connect.commit()才会生效 回滚函数 connect.rollback() 连接数据库 ''' dinghanhua sql server增删改 ''' import py ...

  5. 抓取android系统日志_记录一次定位app闪退故障

    在测试android客户端兼容性时,发现app闪退,上海的小伙伴需要闪退时的系统日志:故把快生锈的adb知识拿出来show一把: 1.下载adb工具包(adb的全称为Android Debug Bri ...

  6. OC 内存管理(retain和release)

    内存管理 retain和release简单使用 #import "Student.h" @implementation Student @synthesize age = _age ...

  7. Echarts横坐标倾斜,顶部显示数字

    最近项目使用到Echarts,所以学习了下 根据API,实现Echarts很简单,在这就不多说了,下面就说说项目中碰到的一些需求 1.由于横坐标很多,导致数据不能展示完整,所以需要设置横坐标样式倾斜展 ...

  8. Hibernate中一对多关联关系中的级联属性

    如果想通过级联属性删除一端的数据和多端的数据要使用 void org.hibernate.Session.delete(Object arg0) 方法. getSession().delete(tea ...

  9. oc 无中生有添加协议(使已有函数符合协议)

    class_addProtocol([UIButton class],@protocol(UIButtonExport)); @protocol UIButtonExport <JSExport ...

  10. iOS 代码混淆--pch实现

    之前实现代码的混淆一般是使用sh脚本,不过也是需要把一写需要混淆的方法写到一个文件中(除非是使用特定的命名规范统一混淆), 现在发现,实现代码的混淆pch 文件就可以轻松完成! 1,在新建的工程中 创 ...