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. zip4j之加压解压

    最近看同事搞个文件打包,搞了大半天,还是有问题!嗨~~ 网上明明有现成的,偏偏要自己写! 下面是基于zip4j实现加压解决的简单工具类 package com.learcher.zip; import ...

  2. datatable 动态显示/隐藏列

    这个例子演示了 column().visible()方法来隐藏显示列,通过点击列按钮动态切换 <table id="example" class="display& ...

  3. bootstrapTable表格表头换行

    使用bootstrapTable组件,达到表头中有一格显示两行,其他表头均为一行,效果图如下: 代码: { field : 'pay_date', title : '已还款完成时间', valign: ...

  4. React中的虚拟DOM

    当组件当state和props发生变化当时候,组件当render函数就会重新执行,组件就会被重新渲染,react中实现这种重新渲染,他的性能是非常高的,因为他引入了一个虚拟Dom的概念,那么什么是虚拟 ...

  5. refinedet网络结构

    refinedet只预测4个层,并且只有conv6_1.conv6_2,没有ssd中的conv7.8.9 refinedet的4个层都只有1个aspect ratio和1个min_size,所以每层每 ...

  6. 记安卓appium自动化测试实践

    一.软件安装 1. 安装node.js,安装路径D:\Program Files\nodejs\ 可以在官网下载https://nodejs.org/zh-cn/download/,版本号为node- ...

  7. lucene&solr学习——索引维护

    1.索引库的维护 索引库删除 (1) 全删除 第一步:先对文档进行分析 public IndexWriter getIndexWriter() throws Exception { // 第一步:创建 ...

  8. PowerDesign16.6支持Mysql的生成sql脚本中包含Collate信息

    当前powerDesign版本:16.6 列上指定:Collation = utf8_general_ci 但是SQL脚本中,列字段没有显示Collect ---------------------- ...

  9. deep learning学习记录一

    最近不小心又赶了一下时髦,在做deep learning.今天去听了复旦吴老师的课程,感觉吴老讲解的还是很清晰的. 上午刚看过cnn,下午讲解的就是这章,相对来说,我听着给了很多启发.

  10. iOS之已经审核通过的app在App Store上搜不到的解决办法

    修改定价将你的app定价修改成0.99刀 修改你的发行范围,全取消后只选中国. save这时候你的app status将会变成pending contract. 将之前的修改都改回来,修改定价free ...