JavaScript教程(十)--- 带键的集合

带键的集合

本章将介绍由键索引的数据集合;Map 和 Set 对象包含可按插入顺序迭代的元素。

Map

Map 对象

Map 对象就是一个简单的键/值对映射集合,可以按照数据插入时的顺序遍历所有的元素。

下面的代码演示了使用 Map 进行的一些基本操作。请参考 Map 以获取更多的样例和完整的 API。你可以使用 for...of 循环来在每一次迭代中得到 [key, value] 数组。

const sayings = new Map();
sayings.set("dog", "woof");
sayings.set("cat", "meow");
sayings.set("elephant", "toot");
sayings.size; // 3
sayings.get("dog"); // woof
sayings.get("fox"); // undefined
sayings.has("bird"); // false
sayings.delete("dog");
sayings.has("dog"); // false

for (const [key, value] of sayings) {
  console.log(`${key} goes ${value}`);
}
// "cat goes meow"
// "elephant goes toot"

sayings.clear();
sayings.size; // 0

Object 和 Map 的比较

一般地,object 会被用于将字符串类型映射到值。Object 允许设置键值对、根据键获取值、删除键、检测某个键是否存在。不过,Map 对象还有一些优点,可以更好地应用于映射关系表示中。

  • Object 的键均为字符串或 Symbol 类型,在 Map 里键可以是任意类型。
  • 必须手动计算 Object 的大小,但是可以很容易地获取 Map 的大小(size)。
  • Map 的遍历遵循元素的插入顺序。
  • Object 有原型,所以映射中有一些缺省的键。(可以用 map = Object.create(null) 回避)。

这三条提示可以帮你决定用 Map 还是 Object

  • 如果键在运行时才能知道,或者所有的键类型相同,所有的值类型相同,那就使用 Map
  • 如果需要将原始值存储为键,则使用 Map,因为 Object 将每个键视为字符串,不管它是一个数字值、布尔值还是任何其他原始值。
  • 如果存在需要对个别元素进行操作的逻辑,使用 Object

WeakMap 对象

WeakMap 是键/值对的集合,其键必须是对象或非注册符号,其值为任意 JavaScript 类型,并且不会对其键创建强引用。也就是说,一个对象作为键出现在 WeakMap 中并不会阻止该对象被垃圾回收。一旦作为键的对象被收集,其在任何 WeakMap 中的相应值也会被垃圾收集,只要它们没有在其他地方被强引用。唯一可用作 WeakMap 键的原始类型类型是 symbol,更具体地说,是非注册 symbol,因为非注册 symbol 保证是唯一的,并且不能被重新创建。

WeakMap API 与 Map API 基本相同。不过,WeakMap 不允许观察其键的有效性,这也是它不允许枚举的原因。因此,没有任何方法可以获取 WeakMap 中的键的列表。如果有的话,该列表将取决于垃圾回收的状态,从而引入非确定性。

可以在 WeakMap 参考页的“为什么使用 WeakMap”小节查看更多信息和示例。

WeakMap 对象的一个用例是存储一个对象的私有数据或隐藏实现细节。Nick Fitzgerald 的博文“使用 ECMAScript 6 WeakMap 隐藏实现细节”提供了一个例子。对象内部的私有数据和方法被存储在 WeakMap 类型的 privates 变量中。所有暴露出的原型和实例都是公开的,而其他内容都是外界不可访问的,因为模块并未导出 privates 对象。

const privates = new WeakMap();

function Public() {
  const me = {
    // 这里是私有数据
  };
  privates.set(this, me);
}

Public.prototype.method = function () {
  const me = privates.get(this);
  // 处理 `me` 中的私有数据
  // …
};

module.exports = Public;

Set

Set 对象

Set 对象是一组唯一值的集合,可以按照添加顺序来遍历。Set 中的值只能出现一次;它在集合 Set 中是唯一的。

以下代码演示了 Set 的基本操作,更多示例和完整 API 可以参考 Set。

const mySet = new Set();
mySet.add(1);
mySet.add("some text");
mySet.add("foo");

mySet.has(1); // true
mySet.delete("foo");
mySet.size; // 2

for (const item of mySet) {
  console.log(item);
}
// 1
// "some text"

数组和 Set 之间的转换

可以使用 Array.from 或展开语法来完成集合到数组的转换。同样,Set 的构造函数接受数组作为参数,可以完成从 Array 到 Set 的转换。

备注: Set 对象存储唯一值,所以数组转换为 Set 时,任何重复值将会被删除!

Array.from(mySet);
[...mySet2];

mySet2 = new Set([1, 2, 3, 4]);

数组和 Set 的对比

一般情况下,在 JavaScript 中使用数组来存储一组元素,而新的 Set 对象有这些优势:

  • 根据值(arr.splice(arr.indexOf(val), 1))删除数组元素效率低下。
  • Set 对象允许根据值删除元素,而数组中必须使用基于元素下标的 splice 方法。
  • 数组的 indexOf 方法无法找到 NaN 值。
  • Set 对象存储唯一值,所以不需要手动处理包含重复值的情况。

WeakSet 对象

WeakSet 对象是可收集垃圾值的集合,包括对象和非注册 symbol。WeakSet 中的值只能出现一次。它在 WeakSet 的集合中是唯一的。

与 Set 对象的主要区别有:

  • 与 Set 相反,WeakSet 是对象或 symbol 的集合,而不是任何类型的任意值的集合。
  • WeakSet 的是指集合中的对象是弱引用的。如果 WeakSet 中存储的一个对象不存在其他的引用,那么它就会被垃圾回收。这也意味着集合中不再存储当前对象。
  • WeakSet 不可枚举。

WeakSet 对象的用例有限。它们不会泄露内存,因此可以安全地使用 DOM 元素作为键,并将其标记用于跟踪等目的。

Map 和 Set 的键值相等

Map 对象和 Set 对象的键和值的等值判断都基于 SameValueZero 算法:

  • 等价的作用类似于严格相等运算符 ===
  • -0 和 +0 相等。
  • NaN 与自身相等(与 === 有所不同)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/549281.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【云原生数据库:原理与实践】1- 数据库发展历程

1-数据库发展历程 1.1 数据库发展概述 从1960年:Integrated Database System(IDS),该系统是一个网状模型(Network Model)到 IMS(Information Management System),使用了…

Rust腐蚀服务器清档多教程

Rust腐蚀服务器清档多教程 大家好我是艾西,一个做服务器租用的网络架构师。上期教了大家怎么搭建服务器以及安装插件等那么随着大家自己架设服或是玩耍的时间肯定会有小伙伴想要去新增开区数量或是把原本的服务器进行一些调整等,那么今天主要聊的就是怎…

【智能算法】鸭群算法(DSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年,Zhang等人受到自然界鸭群觅食行为启发,提出了鸭群算法(Duck Swarm Algorithm, DSA)。 2.算法原理 2.1算法思想 DSA基于自然界鸭群觅食过程&…

[leetcode] max-area-of-island

. - 力扣(LeetCode) 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水&…

基于SpringBoot+Vue的共享汽车管理系统(源码+文档+包运行)

一.系统概述 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了共享汽车管理系统的开发全过程。通过分析共享汽车管理系统管理的不足,创建了一个计算机管理共享汽车管理系统的方案。文章介绍了共享汽车管理…

从 MySQL 到 DynamoDB,Canva 如何应对每天新增的 5000 万素材

作为一款设计工具,Canva 吸引人的一个重要特色就是拥有数以亿计的照片和图形资源,支持用户上传个人素材。 Canva 于 2013 年推出,设立了一个包含大量照片和图形的资源库,并允许用户上传自己的素材以用于设计。从发布之日起&#…

Python数学建模学习-PageRank算法

1-基本概念 PageRank算法是由Google创始人Larry Page在斯坦福大学时提出,又称PR,佩奇排名。主要针对网页进行排名,计算网站的重要性,优化搜索引擎的搜索结果。PR值是表示其重要性的因子。 中心思想: 数量假设&#…

JavaScript基础:js介绍、变量、数据类型以及类型转换

目录 介绍 引入方式 内部方式 外部形式 注释和结束符 单行注释 多行注释 结束符 输入和输出 输出 输入 变量 声明 赋值 关键字 变量名命名规则 常量 数据类型 数值类型 字符串类型 布尔类型 undefined 类型转换 隐式转换 显式转换 Number ✨介绍 &a…

typescript中的type关键字和interface关键字区别

Type又叫类型别名(type alias),作用是给一个类型起一个新名字,不仅支持interface定义的对象结构,还支持基本类型、联合类型、交叉类型、元组等任何你需要手写的类型。 type num number; // 基本类型 type stringOrNum string |…

47.HarmonyOS鸿蒙系统 App(ArkUI)创建轮播效果

创建轮播效果,共3页切换 Entry Component struct Index {State message: string Hello Worldprivate swiperController: SwiperController new SwiperController()build() {Swiper(this.swiperController) {Text("第一页").width(90%).height(100%).bac…

BLE架构图

PHY层(Physical layer 物理层) PHY层用来指定BLE所用的无线频段(2.4G),调制解调方式和方法、跳频等。PHY层的性能直接决定整个BLE芯片的功耗、灵敏度以及selectivity等射频指标。 LL层(Link Layer 链路层) 链路层主要是对RF射频控制。链路层定义了协议栈中最为基础的…

C++解决大学课设所有管理系统(增删查改)

C一篇解决大学课设所有**管理系统(增删查改) 文章目录 C一篇解决大学课设所有**管理系统(增删查改)1.引言1.1 使用结果展示 2. 基本原理3. 文件层次结构4.具体实现(通讯录管理系统为例)4.1 通讯录实体类(addressbook.h)4.2 通讯录实现类(addressbook.cpp)4.3 通讯录管理类&…

蓝桥杯 — — 完全日期

完全日期 友情链接:完全日期 题目: 思路: 直接从20010101枚举到20211231,然后再判断每一个数是否是一个合法的日期,如果这个日期是合法的,接着判断这个日期的每一个位置上的数字之和是否是一个完全平方数…

ChatGPT 可以预测未来吗?

推荐 4月13日的一篇有趣的 paper,特来分享。 👉 当前的大型语言模型(LLMs)具有强大的数据合成和推理能力,但它们在直接预测尚未发生事件的准确性上常常受到限制。传统的预测方法依赖于直接询问模型关于未来的问题。 …

linux下安装nacos2.2.0

1、获取下载地址并下载 1.1、打开nacos官网 1.2、找到对应版本,点进去 ## 1.3、复制地址 1.4下载 # 进入要安装的目录,cd /usr/local/src # 执行wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz2、 安装…

【产品经理修炼之道】- 平台型产品经理与业务型产品经理

从2015年开始,阿里的产品经理招聘分为平台型和业务型,后来很多互金公司逐步学习采纳了这种分工方式,那么什么是平台型产品经理,什么是业务型产品经理呢?先上结论: 平台型产品经理(产品设计&…

loD:如何实现代码的“高内聚、低耦合“

设计模式专栏:http://t.csdnimg.cn/3a25S 目录 1.引用 2.何为"高内聚、低耦合" 3.LoD 的定义描述 4.定义解读与代码示例一 5.定义解读与代码示例二 1.引用 本节介绍最后一个设计原则:LoD(Law of Demeter,迪米特法则)。尽LoD不像SOLID、KI…

CTFshow-PWN-Test_your_nc(pwn0-pwn4)

1、pwn0 连上,等它程序执行完你可以直接来到 shell 界面 执行命令,获取 flag ctfshow{294ffc57-ee28-40ea-8c74-4dfeaf89d1e7} 2、pwn1 提供一个后门函数,连上即可得到flag 下载附件,拉进 ubantu ,使用命令 checksec …

深度学习基础——计算量、参数量和推理时间

深度学习基础——计算量、参数量和推理时间 在深度学习中,计算量、参数量和推理时间是评估模型性能和效率的重要指标。本文将介绍这三个指标的定义、计算方法以及如何使用Python进行实现和可视化展示,以帮助读者更好地理解和评估深度学习模型。 1. 定义…
最新文章