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,其 ...
随机推荐
- 微软账号密码修改后提示密码错误的解决方法(远程桌面&smb共享访问等)
众所周知,自从微软将Microsoft账户与Windows账号强制绑定后,使用起来便一直有诸多困难,在Microsoft Support和搜索引擎长期搜索解决方案未果,今天偶然在一个佬的博客翻到了这个 ...
- Laravel 组件
创建组件命令 php artisan make:component Alert make:component 命令还将为组件创建视图模板.视图将放在 resources/views/component ...
- 01-初识springboot
目录 01,什么是springboot 02,如何使用springboot 01,什么是springboot springboot是一个基于spring框架开发出来的一个新的框架,目的是为了简化spr ...
- RHCA rh442 002 监控工具 脏页 块设备名 缓存
sar 看某一个时间的数据 sar -d 1 5 与iostat类似 计算机识别设备按编号识别 0-15预留出 8 为iscsi设备 做一个块设备名 名字不重要是给人看的,重要的是编号 8 17(主编 ...
- 从pytest源码的角度分析pytest工作原理
从pytest源码的角度分析pytest工作原理 从 pytest 源代码的角度来分析其工作原理,我们需要关注几个关键的部分,特别是 pytest 的启动过程以及测试的收集与执行.下面是基于 pyte ...
- Python获取指定网段正在使用的IP
Python获取指定网段正在使用的IP #!/usr/bin/env python # -*- coding: utf-8 -*- ''''' 使用方法样例 python test20.py 192. ...
- vue3 + ts 中出现 类型“typeof import(".........../node_modules/vue/dist/vue")”的参数不能赋给类型“Component<any, any, any, ComputedOptions, MethodOptions>”的参数。
错误示例截图 解决方法 修改shims-vue.d.ts中的内容 declare module "*.vue" { import { defineComponent } from ...
- 区块链DApp学习开发入门 视频
学习视频: https://www.bilibili.com/video/BV13E411P7km?p=1 https://www.bilibili.com/video/BV14z4y1Z7Jd?p= ...
- pyglet.gl.ContextException: Could not create GL context
参考: https://www.saoniuhuo.com/question/detail-2725960.html ========================================= ...
- Mongolia地区民间风俗的一些理解
声明:本文的内容为自己学习历史后的一些个人理解,其中内容的真实性并未考证. 总所周知,Mongolia地区有内外之分现在,但是以前均为我国领土,后来由于种种历史原因导致外Mongolia分离了出去,这 ...