Set构造函数及其属性

2023-11-03

Set()构造函数用来创建Set对象。Set对象类似于数据,其成员数据都是唯一的,没有重复的值,无论是基本数据类型还是对象类型。

Set本身是个构造函数,只能通过new操作符来进行构造函数调用,不能通过函数调用来创建Set对象。

如果不传递参数给Set构造函数,则创建一个空的Set。如果要传递参数,则这个参数必须是一个可迭代的对象,如数组或类数组对象。

new Set(iterable);

向Set中加入值的时候,不会进行类型转换。由于Set内部的值是唯一的,所以需要判断两个值是否相等。Set内部判断两个值是否相等所使用的算法类似于严格相等。但对NaN是例外,因为NaN始终不等于NaN,但在Set内部,NaN最多只能有一个值。

new Set(); // {}
new Set([1,2,3,3,4,4,5,5,5]); // {1, 2, 3, 4, 5}

Set的属性


Set本身有一个length属性,其值固定为0。有一个prototype属性对象,上有一个constructor属性,指向Set本身。

Set.length; // 0
Set.prototype.constructor === Set; // true

Set.prototype


Set本身没有提供任何方法。但Set.prototype属性对象上提供了若干的属性和方法,用于在Set实例上使用。

Set.prototype.size属性,表示Set实例对象中有多少个值。

Set.prototype.constructor属性返回创建实例的构造函数,默认就是Set构造函数本身。

Set.prototype还有9个方法:

(1)Set.prototype.add ( value ):添加某个值,返回Set结构本身。

(2) Set.prototype.clear ( ):清除所有数据成员。

(3) Set.prototype.has ( value ):返回一个布尔值,表示参数是否为Set的成员。

(4) Set.prototype.delete ( value ):删除某个值,返回一个布尔值表示是否删除成功。

(5) Set.prototype.keys ( ):返回一个键名的遍历器。

(6) Set.prototype.values ( ):返回一个键值的遍历器。

(7) Set.prototype.entries ( ):返回一个键值对的遍历器。

(8) Set.prototype.forEach ( callbackfn [ , thisArg ] ):使用回调函数遍历每个成员。

(9) Set.prototype [ @@iterator ] ( ):返回一个键值遍历器。

Set.prototype.add 方法


Set.prototype.add()方法用于向Set对象末尾添加一个指定的值,并返回Set对象本身。如果值已存在,则添加不会成功。

语法

set.add(value);
参数

value:要添加的值。

返回值

set对象本身。

示例

var set = new Set(); // 创建一个空的Set
set.add(1);          // {1}
set.add(2);          // {1,2}
set.add(3);          // {1,2,3}
set.add(0);          // {1,2,3,0}
set.add(-0);         // {1,2,3,0}
set.add(1);          // {1,2,3,0}
set.add(NaN);        // {1,2,3,0,NaN}
set.add(null);       // {1,2,3,0,NaN,null}
set.add(undefined);  // {1,2,3,0,NaN,null,undefined}
set.add({});         // {1,2,3,0,NaN,null,undefined,{}}
set.add(NaN);        // {1,2,3,0,NaN,null,undefined,{}}
set.add(null);       // {1,2,3,0,NaN,null,undefined,{}}
set.add(undefined);  // {1,2,3,0,NaN,null,undefined,{}}
set.add({});         // {1,2,3,0,NaN,null,undefined,{},{}}

Set.prototype.clear 方法


Set.prototype.clear()方法用来清空一个Set对象的所有元素,没有返回值。

示例

var set = new Set([1,2,3,4,5,6,5,6]);
set.size; // 6
set.clear();
set.size; // 0

Set.prototype.has 方法


Set.prototype.has()方法接受一个参数,返回一个布尔值,表明该参数是否存在于Set对象中。

语法

set.has(value);
参数

value:要检测的值

返回值

一个布尔值,表明该参数是否存在于Set对象中。

示例

var set = new Set([1,2,3,5,6,7, {}, null, undefined, NaN, -0]);
set.has(1);         // true
set.has(null);      // true
set.has(undefined); // true
set.has(NaN);       // true
set.has(0);         // true
set.has({});        // false,两个对象永远都不相等
set.has();          // false,并不会因为空调用而传入undefined

Set.prototype.delete 方法


Set.prototype.delete()接受一个参数,用来在Set实例中删除指定的值。返回一个布尔值,表明是否删除成功。

语法

set.delete(value);
参数

value:要从Set实例中删除的值

返回值

表明是否删除成功的布尔值。

示例

var set = new Set([1,null, undefined, {}, 0, NaN]);
set.delete();           // true
set.size;               // 6
set;                    // {1, null, {}, 0, NaN}
set.delete(1);          // true
set.delete(-0);         // true
set.delete(NaN);        // true
set.delete(undefined);  // false
set.delete({});         // false
set.delete(null);       // true

当进行空调用时,value的值为undefined,因此上实例中,第一个delete操作返回true,而此时set中已无undefined这个值,故在set.delete(undefined)的操作中,返回了false。

Set.prototype.keys 方法


Set.prototype.keys()返回Set实例对象的键名遍历器。但由于Set没有键名,只有键值,故keys()方法和Set.prototype.values()方法的返回值是一致的,也可以理解成keys()方法是values()方法的别名 (出于与 Map 对象保持相似的原因),返回的都是键值。

示例

var set = new Set([1,2,3,3,4,4,5,5,5]);
set; // {1, 2, 3, 4, 5}
var iter = set.keys();
iter.next().value; // 1
iter.next().value; // 2
iter.next().value; // 3
iter.next().value; // 4
iter.next().value; // 5
iter.next(); // undefined

Set.prototype.values 方法


Set.prototype.values()方法返回一个键值的遍历器。这个对象以插入Set 对象的顺序包含了原 Set 对象里的每个元素。

var set = new Set([1,2,3,3,4,4,5,5,5]);
set; // {1, 2, 3, 4, 5}
var iter = set.values();
iter.next().value; // 1
iter.next().value; // 2
iter.next().value; // 3
iter.next().value; // 4
iter.next().value; // 5
iter.next(); // undefined

Set.prototype.entries 方法


Set.prototype.entries()方法返回一个键值对的遍历器。由于Set对象实例没有键名,故返回的迭代器的每一项的值都是两个相同值组成的数组。

var set = new Set('abcde');
set; // {"a", "b", "c", "d", "e"}
var iter = set.entries();
iter.next().value; // ['a', 'a']
iter.next().value; // ['b', 'b']
iter.next().value; // ['c', 'c']
iter.next().value; // ['d', 'd']
iter.next().value; // ['e', 'e']
iter.next(); // undefined

Set.prototype.forEach 方法


Set.prototype.forEach()方法根据集合中元素的顺序,对每个元素都执行提供的回调函数一次,该方法没有返回值。

语法

set.forEach(func, thisArg);

参数

func:回调函数。Set对象的每个值都会执行一次这个函数。该函数接受3个参数,分别是元素的值,元素的索引和Set对象本身。由于Set对象没有索引,故该函数的第一个参数和第二个参数的值是一样的。

thisArg:func中绑定的this对象。如果不提供该值,在严格模式下是undefined,非严格模式下是全局对象。

示例1:输出Set对象中的值

var set = new Set('photoshop');
set.forEach(function (value, key) {
    console.log("value:", value, "key:", key);
});
/*
value: p key: p
value: h key: h
value: o key: o
value: t key: t
value: s key: s
*/

示例2:在遍历过程中添加元素

var set = new Set('photoshop');
var i = 0;
set.forEach(function (value) {
    if (i < 5) {
        set.add(++i);
    }    
    console.log("value:", value);
});
/*
value: p
value: h
value: o
value: t
value: s
value: 1
value: 2
value: 3
value: 4
value: 5
*/

在遍历过中添加的新元素会被遍历发现且处理。

示例3:在遍历过程中删除元素

var set = new Set('photoshop');
var i = 0;
var array = ["t", "s"];
set.forEach(function (value) {
    if (i < 2) {
        set.delete(array[i++]);
    }    
    console.log("value:", value);
});
/*
value: p
value: h
value: o
*/

在遍历过程中删除未访问的元素,将无法再被访问到。

示例4:在遍历过程中先删除已访问元素,后再添加被删除的元素

var set = new Set('photoshop');
set; // {"p", "h", "o", "t", "s"} 
var i = 0;
set.forEach(function (value) {
    console.log("value:", value);
    if (i == 0) {
        set.delete('p');
    } else if (i == 3) {
        set.add('p');
    }
    i++;
});
/*
value: p
value: h
value: o
value: t
value: s
value: p
*/
set; // {"h", "o", "t", "s", "p"}

在遍历过程中删除已经访问过的元素,然后再进行添加,会在本次遍历中继续被访问到,此时已相当于是新增了一个元素。

Set.prototype[Symbol.iterator] 方法


该方法返回一个遍历器对象。其作用和Set.prototype.values()一致。

原文地址:https://zhuanlan.zhihu.com/p/53418464

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Set构造函数及其属性 的相关文章

  • 在 config() 模块中注入依赖项 - AngularJS

    目前在 app js 中我有以下路线 var gm angular module gm gm services gm directives gm filters gm controllers ngSanitize gm config rou
  • Vue.js + Element UI:在更改时获取“event.target”

    我无法获取在事件处理程序中触发事件的 html 字段 在 javascript 中是event target 我有一个表格 附加到更改事件函数的输入元素 管理更改事件的函数 我的代码如下 var Main methods change pa
  • 将nodejs Express静态请求重定向到https

    我需要将所有 http 请求重定向到 https 包括对静态文件的请求 My code app use express static dirname public app get function req res if req secure
  • Safari 不触发表单提交

    对于一个项目 我有两个选择表单字段 它们通过 jquery 触发器 提交 发送 这在 Firefox 和 Chrome 中运行良好 但在 Safari 中没有任何反应 这是 HTML 代码
  • 禁用 chrome React DevTools 以进行生产

    我正在尝试使用 gulp 和 envify 对我的 React 应用程序进行浏览器化以设置 NODE ENV 因此 我可以删除反应警告 控制台中的错误报告 甚至我的代码来禁用某些功能 例如react addons perf的要求 而且效果很
  • JQuery UI Draggable - 如何知道元素是否可拖动初始化?

    我的逻辑是 if this draginited a drag disabled element shouldn t get pass here as it is inited this draggable 我搜索了很多 找不到实现这个逻辑
  • 计算div中有多少个元素

    我有一个div 里面有span 有没有一种方法可以计算 div 中有多少个元素 然后将其作为值给出 例如 一个 div 中有 5 个跨度 那么它会对其进行计数并发出警报 5 请使用 JavaScript 谢谢 如果你想要后代的数量 你可以使
  • 使用 lambda 更新 amazon s3 对象元数据而不执行对象复制?

    是否可以使用 lambda 函数添 加或更新 s3 对象元数据而不复制对象 这篇 2 年前的帖子说我们确实需要复制一份 https stackoverflow com questions 32646646 how do i update m
  • 如何使用 RSpec 测试 javascript 重定向?

    我正在使用 xhr post 与控制器交互 并且我期待重定向 在 js erb 中 我有 window location href address 手动测试 浏览器会正确重定向 我如何使用 RSpec 测试它 response should
  • React:未捕获的引用错误:未定义需求

    我正在阅读 React 教程 http facebook github io react docs animation html http facebook github io react docs animation html 并且我无法
  • React-Router v5 History.push 不触发组件

    很抱歉朋友们又问这个问题了 我找到了解决这个问题的几个方法 但他们让我很困惑 我只是想问一个优雅的方法来做到这一点 正如你通过标题所理解的 我有一个关于反应路由的问题 让我解释 我有一个按钮 其名称是Login 单击按钮后 我执行了一些逻辑
  • 节省页面加载时间的提示[重复]

    这个问题在这里已经有答案了 我的问题 削减那些不必要的 kb 并使页面加载速度更快的最佳方法是什么 全部是什么优化实践 编码实践 在js php中 如果执行可以使您的页面更轻 为什么我问这个 我读了这篇关于 jquery js 与 jque
  • Immutable.js 推入嵌套对象中的数组

    假设有一个对象 const object foo bar 1 2 3 我需要推动4 to object foo bar array 现在我正在这样做 const initialState Immutable fromJS object co
  • Ajax调用完成后执行函数

    我是 Ajax 新手 我尝试在使用 for 循环时使用 Ajax Ajax 调用之后 我正在运行一个使用 Ajax 调用中创建的变量的函数 该函数只执行两次 我认为 Ajax 调用可能没有足够的时间在循环开始之前进行调用 有没有办法在运行
  • 如何在没有查询参数的情况下重新加载页面?

    假设我想重新加载www domain com abc num 4 但我想重新加载www domain com abcONLY 问号后没有所有内容 window location window location href split 0
  • 同源政策目的可疑

    正如我所读到的 同源策略是防止源自 邪恶 域 A 的脚本向 良好 域 B 发出请求 换句话说 跨站点请求伪造 玩了一下我了解到的Access Control Allow Origin标头和CORS据我了解 它允许从好域 B 指定服务器 域
  • 检测浏览器是否支持 contentEditable?

    There s 这个问题 https stackoverflow com questions 3497942 browser detect contenteditable features 但发布的解决方案是浏览器嗅探 我试图避免这种情况
  • 401 未经授权的帖子回复

    我一直在使用 Angular 模板制作 Node js 网站 但我无法在 DB Mongo 上创建数据 这是代码 节点路由 var Property mongoose model Property var jwt require expre
  • 如何清除画布中图像上的矩形

    我需要清除画布中图像上绘制的矩形 而不损坏现有图像 我可以绘制小矩形点并将其清除 但问题是 当我清除矩形时 它在图像上仍保留为白色小斑点 有人可以告诉我如何清除图像上的矩形而不损坏现有图像 我使用了以下方法来清除矩形 但没有用 1 cont
  • 检测未定义的对象属性

    如何检查 JavaScript 中的对象属性是否未定义 检查属性值是否为特殊值的常用方法undefined is if o myProperty undefined alert myProperty value is the special

随机推荐

  • JAVA求素数和模拟条件

    题目 牛宝在新的一年里打算扫除过去身上的坏运气 故他打算筛选出今年第1 365天中符合今年自己的那些幸运数字 在今年对应数字的那一天做特殊的事 这些数字受限于乾卦和坤卦两个卦象条件 牛宝需自己破译出来才行 你能帮助他吗 根据牛宝得知的乾坤卦
  • 【Python之路——基础回顾90列】

    基础 1 求绝对值 求绝对值或复数的模 gt gt gt abs 6 6 2 元素都为真 接受一个迭代器 如果迭代器的 所有元素 都为真 那么返回 True 否则返回 False gt gt gt all 0 1 2 3 False gt
  • 7,tcl双引号和花括号

    注 学习 交流就在博主的个人weixin公众号 FPGA动力联盟 留言或直接 博主weixin fpga start 私信 关于xilinx vivado FPGA XDC约束的所有讲解文档汇总 关于xilinxvivadoFPGAXDC约
  • BeanUtils和JSON对象复制性能对比

    对比对象 常见的BeanUtils有2个 spring有BeanUtils 浅拷贝 apache的commons也有BeanUtils 深拷贝 测试 200000次循环 测试次数 200000次循环 测试结果 依旧是20倍左右的差距 循环2
  • Windows Server 2008 的十大重要新特性

    Windows Server 2008 十项重要新技术 在微软的新产品Windows server 2008中 相比以前版本的 服务器 操作系统 又融入了十项强大的新技术 不敢说这些技术是否真的能让用户得到更好的服务 但就微软而言 体现了其
  • EDA实验:数字频率计(FREQ)设计(VHDL)

    目录 一 实验要求 二 程序源代码 2 1 CLKGEN的VHDL源程序及分析 2 2 REG32B的VHDL源程序及分析 2 3 TESTCTL的VHDL源程序及分析 2 4 FREQ的VHDL源程序及分析 三 硬件实验现象 四 对实验步
  • 【Apache Spark 】第 9 章使用 Apache Spark构建可靠的数据湖

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • unicode 和 utf8

    关于 unicode utf8 文章来自于 http blog csdn net tge7618291 article details 7599902 ascii 主要来表示英文 但是要全世界那么多语言符号文字 ascii就不够使用了 为了
  • ADFS 证书自动更新问题

    ADFS 证书自动更新问题 确定ADFS是否开启自动更新 查看ADFS属性 如何确定当前证书何时到期 文章参考地址 https docs microsoft com en us windows server identity ad fs o
  • 文件上传漏洞详解(CTF篇)

    需要了解的前置知识 1 什么是文件上传 文件上传就是通过流的方式将文件写到服务器上 文件上传必须以POST提交表单 表单中需要
  • js实现页码的切换

    效果图 页面布局与样式
  • 程序设计【Week4】作业

    A题 题意 ZJM 有 n 个作业 每个作业都有自己的 DDL 如果 ZJM 没有在 DDL 前做完这个作业 那么老师会扣掉这个作业的全部平时分 所以 ZJM 想知道如何安排做作业的顺序 才能尽可能少扣一点分 请你帮帮他吧 Input 输入
  • vue3监听页面滚轮

    需求 实现滚轮滚动 左侧导航栏动态固定定位 且相应高亮对应的正文内容 难点 监听了scroll之后点击其他页面也会监听 会一直报错 当前页面滚轮滑到最底部后切换别的页面 也是定位在最底部 因为滚轮一直处于监听状态 固定的导航栏不能覆盖顶部信
  • 【北大核心&CSCD期刊】生物特征识别论文投稿经历

    计算机工程与应用 半月刊 审稿快 比较简单
  • AD如何圆形布局led

    1 左击选中led 2 右击复制 点击圆心 3 选择edit paste special 4 输入个数 和角度 360 个数 5 点OK 选择圆心双击
  • 网工必备!超实用的九大常用的网络命令

    一 ping命令 ping是个使用频率极高的实用程序 主要用于确定网络的连通性 这对确定网络是否正确连接 以及网络连接的状况十分有用 简单地说 ping就是一个测试程序 如果ping运行正确 大体上就可以排除网络访问层 网卡 Modem的输
  • Node.js+express连接mysql数据库

    首先nodejs pxpress连接mysql 数据库我们要用的工具有 前提得搭建号nodejs环境 https nodejs org en node官网 进入官网后不要直接下载推荐版本 推荐的node版本太高的有的东西是不兼容的 推荐大家
  • 200个经典C语言程序

    1 绘制余弦曲线 在屏幕上用 显示0 360度的余弦函数cos x 曲线 问题分析与算法设计 如果在程序中使用数组 这个问题十分简单 但若规定不能使用数组 问题就变得不容易了 关键在于余弦曲线在0 360度的区间内 一行中要显示两个点 而对
  • ubuntu安装flex和bison时显示没有可安装候选的解决方案

    任务 在ubuntu虚拟机中下载安装flex和bison 工具版本 Virtual Box6 1 Ubuntu16 BUG描述 输入命令 sudo apt get install flex bison 报错 解决方案 flex和bison属
  • Set构造函数及其属性

    Set构造函数及其属性 Set的属性 Set prototype Set prototype add 方法 Set prototype clear 方法 Set prototype has 方法 Set prototype delete 方