JavaScript – Set and Map
参考
Set 介绍和使用
Set 很像 Array, 但其实它是一个 Iteralbe 对象. 用于保存多个值, 而且具有 unique 特性 (1 个 set 里面不会有重复的值)
注意: Set 是通过 === 加 NaN = NaN 来判断值是否相同. (既不是 === 也不是 Object.is 哦)

它有一些操作值的方法, 顾名思义 add, delete, clear, has, forEach, size
基本添加删除操作
const set = new Set(['a']); // 初始值可以是一个 Array 或者 Iterable
set.add('b').add('b');
console.log(set.size); // 2 (因为 b 是重复的, 会自动被 distinct 掉)
console.log(set.has('a')); // true
const deleted = set.delete('b'); // true
const deleted2 = set.delete('b'); // false (因为 b 已经被洗掉了, 找不到就会返回 false)
set.clear(); // 清除所有的值
遍历 set
set 本身是 Iterable, 可以直接用 for...of 遍历, 它也提供了一个 forEach 方法.
set.add('a').add('b');
const iterator = set[Symbol.iterator]();
console.log(iterator.next().value); // a;
console.log(iterator.next().value); // b;
for (const value of set) {}
set.forEach((value) => {
console.log(value); // a, b
});
keys, values, entries
const valuesIterable = set.values();
const valuesIterator = valuesIterable[Symbol.iterator]();
和 Object.values 类似的方法, 但是 Object 返回的是 Array. Set 返回的是 Iterable.
另外 keys 并不是返回 1,2,3 而是返回和 values 一样的值. enties 返回的是 key value 但是 key 和 value 也是同一个值.
所以对于 Set, 用 set.values 就够了.
WeakSet
WeakSet 是 Set 的另一个版本. 它有一些特别.
Weak 的意思是弱引用.
1. WeakSet 的值只能是对象 (es2023 后,也可以使用 symbol 作为值)
2. WeakSet 保存的对象是弱引用的 (也就是说, 如果垃圾回收, 发现某个对象只存在于 WeakSet 之中, 那不算对象引用, 对象会被垃圾回收掉)
3. WeakSet 不可以遍历, 也不可以 .size (因为垃圾回收的时机是不可预测的, 所以可能遍历到一半就不准了)

常用的方式是存放 element 引用.
Map 介绍和使用
对象的不足
对象有个弱点, 属性只能是 number, string, symbol. 不可以是其它对象.

如果我们想做一个 key value pair, key 希望用 element. 这样就做不了的. 但 Map 可以.
Map 基本用法
const otherObj = {};
const map = new Map();
map.set('a', 'b').set(1, 'c').set(Symbol('symbol'), 'd').set(otherObj, 'e'); // string, number, symbol, object 都可以作为 key
const value = map.get(otherObj); // e
const keys = [...map.keys()]; // a 1 symbol, otherobj
const values = [...map.values()]; // b, c, d, e
const keyValues = [...map.entries()]; // [[a, b], [1, c], [symbol, d], [otherobj, e]]
和 Set 的方法差不多, 需要注意的是 .keys .entries. 它返回的是 iterable 和 Object.keys 返回的 Array 不一样哦. 可以用 Spread Operator 转换成 Array.
Map 初始化
它不直接支持对象初始化, 要用 array array 或者转换
// array array 结构
const map1 = new Map([
['key1', 'key1Value'],
['key2', 'key2Value'],
]);
const map2 = new Map<any, any>(Object.entries({ name: 'Derrick' })); // 转换对象到 array array
Clone Map
const map1 = new Map<string, string>();
map1.set('a', 'aa'); const map2 = new Map(map1); // clone from map1 console.log(map1 === map2); // false console.log([...map2.entries()]); // [["a", "aa"]]
遍历顺序
对象还有一个弱点, 就是它的输出次序其实没有规范. Object.keys 并没有保证属性是创建的顺序.
但是 Map 有. Set 也是有.
WeakMap
和 WeakSet 相同概念. Map 的弱引用版本.

key 只能是对象, 不支持遍历, key 的对象是弱引用的. (es2023 后,key 也可以使用 symbol)
JavaScript – Set and Map的更多相关文章
- ES6新特性:Javascript中的Map和WeakMap对象
Map对象 Map对象是一种有对应 键/值 对的对象, JS的Object也是 键/值 对的对象 : ES6中Map相对于Object对象有几个区别: 1:Object对象有原型, 也就是说他有默认的 ...
- JavaScript中的Map
1.首先,在新版本的浏览器中,已经实现了对Map的原生支持:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glob ...
- 由实现JavaScript中的Map想到的
项目中要用到JavaScript中的Map数据类型,它不像JDK那样有自带的,怎么办?搜了找到一个不错的(http://darkmasky.iteye.com/blog/454749).用这个可以满足 ...
- JavaScript 中的 Map
很多编程语言中都有类似Map这种 键-值对 的数据结构. 可惜,JavaScript没有. 幸运的是,可以自己构建一个Map对象. 对象的定义 <script type="text/j ...
- JavaScript 数组函数 map()
JavaScript 数组函数 map() 学习心得 map()函数是一个数组函数: 它对数组每个原素进行操作,不对空数组进行操作: 不改变原本的数组,返回新数组: arr.map(function( ...
- JavaScript中数组map()方法
JavaScript 数组map()方法创建一个新的数组使用调用此数组中的每个元素上所提供的函数的结果.语法 ? 1 array.map(callback[, thisObject]); 下面是参数的 ...
- JavaScript 对象Array,Map,Set使用
for(int i = 0 :i < 3 ;i++ ){ //[重点说三遍] 在说明每个对象的用法之前,首先说明 JavaScript 对象的使用一定要注意浏览器的兼容性问题!尤其是IE的版本! ...
- javascript——后台传值map类型转换成json对象
前端需要对后端传过来的值进行解析之后再展示,而后端传过来的值可能是各种类型的,一般情况下要么和后端沟通下让他直接传给我们需要的类型,这个,我一般直接自己转,这次后端传回来一个map类型的对象,我转来转 ...
- JavaScript中的Map和Set
JavaScript的默认对象表示方法{}可以视为其他语言中的Map或者Dictionary的数据结构,即一组键值对. 但是JavaScript的对象有个小问题,就是键必须是字符串,但实际上Numbe ...
- JavaScript数组遍历map()的原型扩展
在 JavaScript 1.6 里,javascript 数组增加了几个非常有用的方法:indexOf.lastIndexOf.every. filter. forEach. map. some,其 ...
随机推荐
- [oeasy]python0074[专业选修]字节序_byte_order_struct_pack_大端序_小端序
进制转化 回忆上次内容 上次 总结了 计算字符串值的函数 eval 四种进制的转化函数 bin oct int hex 函数名 前缀 目标字符串所用进制 bin 0b 二进制 oct 0o ...
- 如何更好的使用 Windows
如何更好的使用 Windows Microsoft 辅助功能和工具 键盘快捷方式,常用 ctrl+C 复制 ctrl+V 粘贴 ctrl+X 剪切 ctrl+Z 撤销 ctrl+Y 回退 alt+ta ...
- 【SQL】Lag/Rank/Over窗口函数揭秘,数据分析之旅
七月的夏日,阳光如火,但小悦的心中却是一片清凉与激情.在数据分析项目组的新岗位上,她仿佛找到了自己新的舞台,这里让她得以将深厚的后端技术实力与数据分析的精髓深度融合.每天,她都沉浸在业务需求的分析与数 ...
- Figma 替代品 Excalidraw 安装和使用教程
如今远程办公盛行,一个好用的在线白板工具对于团队协作至关重要.然而,市面上的大多数白板应用要么功能单一,要么操作复杂,难以满足用户的多样化需求.尤其是在进行头脑风暴.流程设计或产品原型绘制时,我们常常 ...
- pytest数据驱动 pandas
pytest数据驱动 pandas 主要过程:用pandas读取excel里面的数据,然后进行百度查询,并断言 pf = pd.read_excel('data_py.xlsx', usecols=[ ...
- 【C】Re09 结构体
一.结构体 Struct 创建和基本使用 #include <stdio.h> #include <stdlib.h> #include <string.h> // ...
- 【TypeScript】02 面向对象
[联合类型] 联合类型(Union Types)可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值. 注意:只能赋值指定的类型,如果赋值其它类型就会报错. var val:strin ...
- 【托普斯的力场】—— ARPG游戏《艾尔登法环》中的人物:托普斯
地址: https://youtube.com/shorts/oSIbOQ_r4fA?si=F-knFwjZ3iPXqPeS https://www.bilibili.com/video/BV1fV4 ...
- c#12 实验特性Interceptor如何使用的一个简单但完整的示例
一直有很多转载dotnet对Interceptor说明文档的,但鲜有说明Interceptor如何使用的,这里写一篇简单示例来展示一下 c# 12 实验特性Interceptor 是什么? 官方解释如 ...
- 告别Hugging Face模型下载难题:掌握高效下载策略,畅享无缝开发体验
告别Hugging Face模型下载难题:掌握高效下载策略,畅享无缝开发体验 Huggingface国内开源镜像:https://hf-mirror.com/ 里面总结了很多下载的方法,下面进行一一讲 ...