Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

 1 const set1 = new Set([1, 2, 3, 4, 5]);
2
3 console.log(set1.has(1));
4 // expected output: true
5
6 console.log(set1.has(5));
7 // expected output: true
8
9 console.log(set1.has(6));
10 // expected output: false

语法

new Set([iterable]);

参数

iterable
如果传递一个可迭代对象,它的所有元素将被添加到新的 Set中。如果不指定此参数或其值为null,则新的 Set为空。

返回值

一个新的Set对象。

简述

Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。

值的相等

因为 Set 中的值总是唯一的,所以需要判断两个值是否相等。在ECMAScript规范的早期版本中,这不是基于和===操作符中使用的算法相同的算法。具体来说,对于 Set s, +0 (+0 严格相等于-0)和-0是不同的值。然而,在 ECMAScript 2015规范中这点已被更改。有关详细信息,请参阅浏览器兼容性 表中的“value equality for -0 and 0”。

另外,NaNundefined都可以被存储在Set 中, NaN之间被视为相同的值(尽管 NaN !== NaN)。

属性

Set.length
length属性的值为0。
get Set[@@species]
构造函数用来创建派生对象.
Set.prototype
表示Set构造器的原型,允许向所有Set对象添加新的属性。

Set实例

所有Set实例继承自 Set.prototype

属性

Set.prototype.constructor
返回实例的构造函数。默认情况下是Set
Set.prototype.size
返回Set对象的值的个数。

方法

Set.prototype.add(value)
Set对象尾部添加一个元素。返回该Set对象。
Set.prototype.clear()
移除Set对象内的所有元素。
Set.prototype.delete(value)
移除Set的中与这个值相等的元素,返回Set.prototype.has(value)在这个操作前会返回的值(即如果该元素存在,返回true,否则返回false)。Set.prototype.has(value)在此后会返回false。
Set.prototype.entries()
返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值的[value, value]数组。为了使这个方法Map对象保持相似, 每个值的键和值相等。
Set.prototype.forEach(callbackFn[, thisArg])
按照插入顺序,为Set对象中的每一个值调用一次callBackFn。如果提供了thisArg参数,回调中的this会是这个参数。
Set.prototype.has(value)
返回一个布尔值,表示该值在Set中存在与否。
Set.prototype.keys()
values()方法相同,返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值。
Set.prototype.values()
返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值。
Set.prototype[@@iterator]()
返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值。

示例

使用Set对象

 1 let mySet = new Set();
2
3 mySet.add(1); // Set(1) {1}
4 mySet.add(5); // Set(2) {1, 5}
5 mySet.add(5); // Set { 1, 5 }
6 mySet.add("some text"); // Set(3) {1, 5, "some text"}
7 var o = {a: 1, b: 2};
8 mySet.add(o);
9
10 mySet.add({a: 1, b: 2}); // o 指向的是不同的对象,所以没问题
11
12 mySet.has(1); // true
13 mySet.has(3); // false
14 mySet.has(5); // true
15 mySet.has(Math.sqrt(25)); // true
16 mySet.has("Some Text".toLowerCase()); // true
17 mySet.has(o); // true
18
19 mySet.size; // 5
20
21 mySet.delete(5); // true, 从set中移除5
22 mySet.has(5); // false, 5已经被移除
23
24 mySet.size; // 4, 刚刚移除一个值
25 console.log(mySet); // Set {1, "some text", Object {a: 1, b: 2}, Object {a: 1, b: 2}}

迭代Set

 1 // 迭代整个set
2 // 按顺序输出:1, "some text"
3 for (let item of mySet) console.log(item);
4
5 // 按顺序输出:1, "some text"
6 for (let item of mySet.keys()) console.log(item);
7
8 // 按顺序输出:1, "some text"
9 for (let item of mySet.values()) console.log(item);
10
11 // 按顺序输出:1, "some text"
12 //(键与值相等)
13 for (let [key, value] of mySet.entries()) console.log(key);
14
15 // 转换Set为Array (with Array comprehensions)
16 var myArr = [v for (v of mySet)]; // [1, "some text"]
17 // 替代方案(with Array.from)
18 var myArr = Array.from(mySet); // [1, "some text"]
19
20 // 如果在HTML文档中工作,也可以:
21 mySet.add(document.body);
22 mySet.has(document.querySelector("body")); // true
23
24 // Set 和 Array互换
25 mySet2 = new Set([1,2,3,4]);
26 mySet2.size; // 4
27 [...mySet2]; // [1,2,3,4]
28
29 // intersect can be simulated via
30 var intersection = new Set([...set1].filter(x => set2.has(x)));
31
32 // difference can be simulated via
33 var difference = new Set([...set1].filter(x => !set2.has(x)));
34
35 // 用forEach迭代
36 mySet.forEach(function(value) {
37 console.log(value);
38 });
39
40 // 1
41 // 2
42 // 3
43 // 4

Array 相关

1 var myArray = ["value1", "value2", "value3"];
2
3 // 用Set构造器将Array转换为Set
4 var mySet = new Set(myArray);
5
6 mySet.has("value1"); // returns true
7
8 // 用...(展开操作符)操作符将Set转换为Array
9 console.log([...mySet]); // 与myArray完全一致

String 相关

1 var text = 'Indiana';
2
3 var mySet = new Set(text); // Set {'I', 'n', 'd', 'i', 'a'}
4 mySet.size; // 5

JavaScript --- Set 集合结构详解的更多相关文章

  1. JavaScript --- Map集合结构详解

    Map 对象保存键值对.任何值(对象或者原始值) 都可以作为一个键或一个值. 语法 new Map([iterable]) 参数 iterable Iterable 可以是一个数组或者其他 itera ...

  2. Javascript常用的设计模式详解

    Javascript常用的设计模式详解 阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javas ...

  3. JavaScript进阶内容——DOM详解

    JavaScript进阶内容--DOM详解 当我们已经熟练掌握JavaScript的语法之后,我们就该进入更深层次的学习了 首先我们思考一下:JavaScript是用来做什么的? JavaScript ...

  4. java集合框架详解

    java集合框架详解 一.Collection和Collections直接的区别 Collection是在java.util包下面的接口,是集合框架层次的父接口.常用的继承该接口的有list和set. ...

  5. web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 规范 HTML结构详解 {前端之前端初识}

    前端之前端初识   前端初识 本节目录 一 web标准 二 浏览器介绍 三 开发工具介绍 四 HTML介绍 五 HTML颜色介绍 六 规范 七 HTML结构详解 一 web标准 web准备介绍: 1. ...

  6. Javascript中prototype属性详解 (存)

    Javascript中prototype属性详解   在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不 ...

  7. JS函数动作分层结构详解及Document.getElementById 释义 js及cs数据类型区别 事件 函数 变量 script标签 var function

    html +css 静态页面 js     动态 交互   原理: js就是修改样式, 比如弹出一个对话框. 弹出的过程就是这个框由disable 变成display:enable. 又或者当鼠标指向 ...

  8. Nuxt.js学习(二) --- Nuxt目录结构详解、Nuxt常用配置项、Nuxt路由配置和参数传递

    [TOC] 1.Nuxt目录结构详解 Nuxt项目文件目录结构 |-- .nuxt // Nuxt自动生成,临时的用于编辑的文件,build |-- assets // 用于组织未编译的静态资源入LE ...

  9. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

随机推荐

  1. 最近在研究asp.net mvc

    看了很多大牛写的博客,依然对mvc云里雾里. 有一点是毋庸置疑的C应该是一座桥梁建立在model和view之间. 在ASP.NET MVC中,控制器通常是继承System.Web.Mvc.Contro ...

  2. anaconda使用,jupyter notebook的使用方法

    1. 通过anaconda安装不同的python环境 1) conda create -n python36 python=3.5 2)  激活虚拟环境: activate python36  # 进 ...

  3. 几个常用的内存、CPU飙高 分析工具

    Process Hacker.Windbg.vs2017 调试托管内存.Microsoft.Samples.Debugging.ants memory profiler.ants performanc ...

  4. 三、curator recipes之共享的可重入读写锁

    简介 curator实现了跨JVM的可重入读写互斥锁.它使用zookeeper去进行加锁,所以指定相同路径的处理线程将会基于“公平锁”的机制去竞争锁资源. 读写锁包含了读锁.写锁两个,它们的互斥关系如 ...

  5. SpringFramework中重定向

    需求: 需要在两个@Controller之间跳转,实现重定向 解决: @PostMapping("/files/{path1}") public String upload(... ...

  6. Groovy中的操作符重载

    操作者 方法 a + b a.plus(b)中 a - b a.minus(b)中 a * b a.multiply(b)中 a ** b a.power(b)中 a / b a.div(b)中 a ...

  7. groovy集合

    groovy集合可以直接在语言中使用,因为它默认已经导入包了. 不需要初始化对象,也不需要专门的类. 集合是groovy语言本地成员.Groovy语法提供了本地列表和相应的映射. 每个Groovy集合 ...

  8. Sql 列转行字符串

    select OrderID,ProdDetailID from A 表A : OrderID,ProdDetailID 1             6 1             7 1       ...

  9. LeetCode赛题390----Elimination Game

    # 390. Elimination Game There is a list of sorted integers from 1 to n. Starting from left to right, ...

  10. SSO单点登录实现原理

    SSO单点登录实现原理 只是简要介绍下基于java的实现过程,不提供完整源码,明白了原理,我相信你们可以自己实现.sso采用客户端/服务端架构,我们先看sso-client与sso-server要实现 ...