参考

Set 和 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的更多相关文章

  1. ES6新特性:Javascript中的Map和WeakMap对象

    Map对象 Map对象是一种有对应 键/值 对的对象, JS的Object也是 键/值 对的对象 : ES6中Map相对于Object对象有几个区别: 1:Object对象有原型, 也就是说他有默认的 ...

  2. JavaScript中的Map

    1.首先,在新版本的浏览器中,已经实现了对Map的原生支持:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glob ...

  3. 由实现JavaScript中的Map想到的

    项目中要用到JavaScript中的Map数据类型,它不像JDK那样有自带的,怎么办?搜了找到一个不错的(http://darkmasky.iteye.com/blog/454749).用这个可以满足 ...

  4. JavaScript 中的 Map

    很多编程语言中都有类似Map这种 键-值对 的数据结构. 可惜,JavaScript没有. 幸运的是,可以自己构建一个Map对象. 对象的定义 <script type="text/j ...

  5. JavaScript 数组函数 map()

    JavaScript 数组函数 map() 学习心得 map()函数是一个数组函数: 它对数组每个原素进行操作,不对空数组进行操作: 不改变原本的数组,返回新数组: arr.map(function( ...

  6. JavaScript中数组map()方法

    JavaScript 数组map()方法创建一个新的数组使用调用此数组中的每个元素上所提供的函数的结果.语法 ? 1 array.map(callback[, thisObject]); 下面是参数的 ...

  7. JavaScript 对象Array,Map,Set使用

    for(int i = 0 :i < 3 ;i++ ){ //[重点说三遍] 在说明每个对象的用法之前,首先说明 JavaScript 对象的使用一定要注意浏览器的兼容性问题!尤其是IE的版本! ...

  8. javascript——后台传值map类型转换成json对象

    前端需要对后端传过来的值进行解析之后再展示,而后端传过来的值可能是各种类型的,一般情况下要么和后端沟通下让他直接传给我们需要的类型,这个,我一般直接自己转,这次后端传回来一个map类型的对象,我转来转 ...

  9. JavaScript中的Map和Set

    JavaScript的默认对象表示方法{}可以视为其他语言中的Map或者Dictionary的数据结构,即一组键值对. 但是JavaScript的对象有个小问题,就是键必须是字符串,但实际上Numbe ...

  10. JavaScript数组遍历map()的原型扩展

    在 JavaScript 1.6 里,javascript 数组增加了几个非常有用的方法:indexOf.lastIndexOf.every. filter. forEach. map. some,其 ...

随机推荐

  1. QCon 回顾 | Data Fabric:逻辑统一、物理分散

    Data Fabric(数据编织),自 2019 年开始就在 Gartner 年度技术趋势榜单上安家,并在 2022 年被列为数据分析领域十大技术趋势之首,它究竟有哪些价值?又如何在企业落地? 在近日 ...

  2. 深入浅出分析最近火热的Mem0个性化AI记忆层

    最近Mem0横空出世,官方称之为PA的记忆层,The memory layer for Personalized AI,有好事者还称这个是RAG的替代者,Mem0究竟为何物,背后的原理是什么,我们今天 ...

  3. fasterWhisper和MoneyPrinterPlus无缝集成

    MoneyPrinterPlus之前使用的是各种云厂商的语音识别服务来进行语音的视频和字幕的识别工作. 但是很多小伙伴说云服务用不起. 那么没办法,MoneyPrinterPlus上线最新版本,支持f ...

  4. 《最新出炉》系列入门篇-Python+Playwright自动化测试-56- 多文件上传 - 下篇

    1.简介 前边的两篇文章中,宏哥分别对input控件上传文件和非input控件上传文件进行了从理论到实践地讲解和介绍,但是后来又有人提出疑问,前边讲解和介绍的都是上传一个文件,如果上传多个文件,Pla ...

  5. BI 工具如何助力市政设计公司实现数字化转型?

    一.前言 近年来,国家出台多个政策文件来鼓励和发展数字化和智能化,如<十四五规划>提出要推进产业数字化转型.<交通强国建设纲要>提出要大力发展智慧交通.上海市发布的<关于 ...

  6. web3产品介绍:mask将Web3的隐私和优势引入像Facebook和Twitter这样的社交媒体平台

    介绍: Mask Network是一个开源的浏览器扩展,将Web3的隐私和优势引入像Facebook和Twitter这样的社交媒体平台.它是一个功能强大的工具,允许用户在社交媒体上享受区块链的隐私保护 ...

  7. 【Uni-App】page.json 配置项一栏笔记

    官方文档 https://uniapp.dcloud.io/collocation/pages 一些配置项是全局的,也可以在页面对象中设置 { "pages": [ //pages ...

  8. 【SqlServer】01 概念及笔记

    视频地址: https://www.bilibili.com/video/BV1qW411y7Bq 一.什么是数据库? 狭义定义: 数据仓库 广义定义: 对数据进行存储和操作的软件,和数据本身合并称为 ...

  9. 【Spring】09 后续的学习补充 vol3

    原生JDBC事务: package dao; import cn.dzz.util.DruidUtil; import org.apache.commons.dbutils.QueryRunner; ...

  10. 强化学习中经验池的替代设计——A3C算法

    读论文<Asynchronous methods for deep reinforcement learning>有感 ---------------------------------- ...