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,其 ...
随机推荐
- EasyBPM进销存之物料管理
本文是EasyBPM平台实现进销存系列中的一篇,主要讲述物料的相关的管理. 在ERP系统中,"物料"一词有着广泛的含义,它是所有产品.半成品.在制品.原材料.配套件.协作件.易耗品 ...
- [oeasy]python0040_换行与回车的不同_通用换行符_universal_newlines
换行回车 回忆上次内容 区分概念 terminal终端 主机网络中 最终的 端点 TeleTYpewriter 电传打印机 终端硬件 shell 终端硬件基础上的 软件壳子 Console 控制台 主 ...
- JuiceFS 直连 NFS 新功能介绍,赋能 NAS 进行 AI 训练
NAS 通过提供多用户网络数据存取服务,极大地简化了数据共享和管理.而 NFS 作为实现这种共享的一种主流协议,尽管广泛应用,但在处理复杂的 AI 训练场景时常常受限于其性能和一致性问题. Juice ...
- js 做树形数组查询筛选功能
对二级菜单进行搜索查询: watch: { librarySearch(val) { if(val == '') { this.libraryFiles = this.libraryFilesAll ...
- Jmeter函数助手37-setProperty
setProperty函数用于修改jmeter属性值. 属性名称:填入需要修改的属性名 Value of property:填入需要修改的属性值 Return Original Value of pr ...
- 【Mybatis】01 概述 & 快速入门Part1
什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射. MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作. MyB ...
- 【Linux】11 RPM & YUM 管理工具 介绍
rpm包的管理 介绍: 一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中. 它生成具有.RPM扩展名的文件.RPM是RedHat Package Manager(RedHat软件包 ...
- python高性能计算:cython使用openmp并行(示例)
y.pyx import cython from cython import parallel from cython.parallel import prange cdef int i cdef i ...
- 【转载】 CNN训练Cifar-10技巧
原文地址: https://www.cnblogs.com/neopenx/p/4480701.html ====================================== 关于数据集 Ci ...
- ViT和MAE模型结合初探
介绍 transfomer在NLP领域的应用已经非常广泛,但是在CV领域的应用还比较少,主要是因为CV领域的数据是二维的,而transfomer是基于序列的,因此需要将二维数据转换成序列数据,这就是V ...