【JavaScript】WeakMap 和 WeakSet

news2024/9/22 13:41:06

Map

Map 用于存储键值对。

  1. 添加属性:
    使用 Map 的 set() 方法可以向 Map 对象中添加键值对。例如:

    const map = new Map();
    map.set('key1', 'value1');
    map.set('key2', 'value2');
    

    通过二维数组快速创建 map 键值对。

     let arr = [
         [1, 2],
         [2, 3],
         [3, 4]
     ]
     let map = new Map(arr)
     console.log(map)  // Map(3) { 1 => 2, 2 => 3, 3 => 4 }
    
    map.keys()  // MapIterator { 1, 2, 3 }
    map.entries() // MapIterator { 1 => 2, 2 => 3, 3 => 4 }
    map.values()  // MapIterator { 2, 3, 4 }
    
  2. 获取属性和长度:
    使用 Map 的 get() 方法可以根据键获取对应的值。使用 Map 的 size 属性可以获取 Map 对象中键值对的数量。例如:

    const map = new Map();
    map.set('key1', 'value1');
    map.set('key2', 'value2');
    const value1 = map.get('key1'); // 获取键为 'key1' 的值
    const size = map.size; // 获取 Map 对象中键值对的数量
    
     let obj = {
         a: 1,
         b: 2,
         c: 3
     }
     console.log(Object.keys(obj).length)
    
  3. 遍历 Map 对象:
    使用 Map 的 forEach() 方法可以遍历 Map 对象的键值对。可以传入一个回调函数,对每个键值对执行相应的操作。例如:

    const map = new Map();
    map.set('key1', 'value1');
    map.set('key2', 'value2');
    map.forEach((value, key) => {
      console.log(key, value); // 打印每个键值对
    });
    
     console.log(map)  // Map(3) { 1 => 2, 2 => 3, 3 => 4 }
     for (let mapElement of map) {
         console.log(mapElement)  // [ 1, 2 ] // [ 2, 3 ] // [ 3, 4 ]
     }
    
  4. 删除属性:
    使用 Map 的 delete() 方法可以根据键删除对应的键值对。例如:

    const map = new Map();
    map.set('key1', 'value1');
    map.set('key2', 'value2');
    map.delete('key1'); // 删除键为 'key1' 的键值对
    
  5. Map 和 Object 的区别:

    • 额外的键:Map 默认情况下不包含任何键,只包含插入的键;一个 Object 有一个原型,原型链上的键名可能和自己在对象上设置的键名冲突,可以使用 Object.create(null) 创建一个没有原型的对象
    • 键的类型:Map 的键可以使用任意类型的值,包括对象、函数、NaN 等,而 Object 的键只能是 String 或 Symbol 类型。
    • 插入顺序:Map 会按照插入顺序保存键值对,而 Object 并不保证属性的顺序(无序)。
    • 迭代和大小:Map 提供了内置的迭代器和方便的方法来获取大小(使用 size 属性),而 Object 需要手动处理迭代和计算大小。
    • 性能:在需要频繁添加、删除和查找键值对的场景中,Map 的性能通常优于 Object。

WeakMap

和 Map 很相似,但会有一些差异:

  1. 引用关联和垃圾回收:WeakMap中的键是弱引用,而Map中的键是强引用。当对象(键)被垃圾回收时, Map 对象将保持引用链接,而 WeakMap 对象将丢失链接。

  2. 键类型限制:在Map中,键可以是任意类型的值,包括原始类型和对象。而在WeakMap中,键只能是对象类型。这是因为WeakMap的实现依赖于对象的引用。

  3. 迭代和大小:Map提供了迭代方法,如forEach、keys、values和entries,可以遍历Map中的键值对。而WeakMap没有提供直接的迭代方法,也没有办法获取WeakMap的大小(即键值对的数量)。

  4. 并非 Map 中所有方法都支持。WeakMap 支持的方法:delete、get、has、set。

  5. 性能:由于WeakMap中的键是弱引用,它的性能可能会受到一些限制。在大规模操作时,WeakMap的性能可能会比Map略差。此外,由于WeakMap不会保留对象的引用,它对垃圾回收的支持更好,有助于避免内存泄漏。

Set

Set 允许存储唯一的值,无论是原始值还是对象引用。

  1. 添加元素:

    • 使用 add(value) 方法向 Set 中添加元素。和 Map 一样,也是不允许添加重复值。如果该值已经存在于 Set 中,则不会重复添加。
  2. 遍历集合:

    • Set 没有提供直接访问元素的索引,因此无法通过索引来遍历。但可以使用迭代器来遍历 Set 中的元素。
    • 使用 forEach(callbackFn, thisArg) 方法迭代 Set 中的每个元素,其中 callbackFn 是回调函数,thisArg 是可选的上下文对象。
    • 使用 for...of 循环遍历 Set 中的元素。
  3. 删除元素:

    • 使用 delete(value) 方法从 Set 中删除指定的元素。如果成功删除该元素,返回 true;如果元素不存在,则返回 false
    • 使用 clear() 方法可以清空整个 Set。
  4. 应用场景:

    • 去重:Set 中的元素是唯一的,这使得它成为去除数组中重复元素的有效工具。
    let arr = [1,3,3,4,5,6,6,6]
    let unique = [...new Set(arr)]
    console.log(unique)
    
    • 并集、交集、差集
    const setA = new Set([1, 2, 3, 4]);
    const setB = new Set([3, 4, 5, 6]);
    
    // 交集
    const intersection = new Set([...setA].filter(x => setB.has(x)));
    console.log([...intersection]);  // 输出: [3, 4]
    
    // 差集
    const difference = new Set([...setA].filter(x => !setB.has(x)));
    console.log([...difference]);  // 输出: [1, 2]
    
    // 并集
    const union = new Set([...setA, ...setB]);
    console.log([...union]);  // 输出: [1, 2, 3, 4, 5, 6]
    

需要注意的是,Set 中的元素是根据其值的唯一性进行存储和比较的,因此对于对象类型的值,它们在 Set 中被视为引用而不是值本身。这意味着两个具有相同属性和值的不同对象将被视为两个不同的元素。

以下是使用 Set 的示例代码:

const set = new Set();

set.add(1);
set.add(2);
set.add(3);

console.log(set.size);  // 输出: 3

set.forEach((value) => {
  console.log(value);
});

// 输出:
// 1
// 2
// 3

set.delete(2);
console.log(set.has(2));  // 输出: false

set.clear();
console.log(set.size);  // 输出: 0

WeakSet

WeakSet 和 Set 区别如下:

  • WeakSet 只能储存对象引用,不能存放值,而 Set 对象都可以
  • WeakSet 对象中储存的对象值都是被弱引用的,即垃圾回收机制不考虑 WeakSet 对该对象的引用,如果没有其他的变量或者属性引用这个对象值,则这个对象将会被垃圾回收掉。(不考虑该对象还存在于 WeakSet
    中),所以 WeakSet 对象里有多少个成员元素,取决于垃圾回收机制有没有运行,运行前后成员个数可能不
    一致,遍历结束之后,有的成员可能取不到,被垃圾回收了。因此ES6规定,WeakSet对象是无法被遍历的,
    也没有办法拿到它包含的所有元素。

WeakSet 能够使用的方法如下:add(), delete(), has(), clear()

如果被垃圾回收掉,WeakSet 将丢失对内部数据的访问链接。

总结

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

window10下安装ubuntu系统以及docker使用

window10下安装ubuntu系统以及docker使用 1. 启用适用于Linux的Windwos子系统2.下载Linux内核更新包3.将 WSL 2 设置为默认版本4.安装Ubuntu<br />直接去Microsoft store里面直接搜索Ubuntu进行安装。5.可能出现的问题1.win10启动ubuntu报错 参考的对象类型不支持尝试的操…

2024中国应急(消防)品牌巡展西安站成功召开!惊喜不断

消防品牌巡展西安站 5月10日&#xff0c;由中国安全产业协会指导&#xff0c;中国安全产业协会应急创新分会、应急救援产业网联合主办&#xff0c;陕西消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-西安站成功举办。该巡展旨在展示中国应急&#xff08;消防&am…

ABC352编程笔记

ABC352 编程笔记 题意&#xff1a;输入&#xff0c;四个数 a , b , c , d a,b,c,d a,b,c,d&#xff0c;若 d d d 在 c , d c,d c,d 之间&#xff0c;则输出 Yes&#xff0c;否则输出 No。 正解&#xff1a;直接判断。 #include <bits/stdc.h> //#define int long lo…

大数据比赛-环境搭建(二)

一、ubuntu安装google 1、下载google的Linux安装版 链接&#xff1a;https://pan.baidu.com/s/1w4Hsa1wbJDfC95fX2vU_1A 提取码&#xff1a;xms6 或者&#xff1a;Google Chrome 64bit Linux版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒 (chromedownloads.net) …

docker-java 操作docker

部署docker 10分钟学会Docker的安装和使用_docker安装-CSDN博客文章浏览阅读2.5w次&#xff0c;点赞44次&#xff0c;收藏279次。文章目录Docker简介Docker安装Windows安装Linux安装CentOS安装Ubuntu安装最近花了些时间学习docker技术相关&#xff0c;在此做一些总结&#xff0…

静态IP代理:网络世界的隐秘通道

在数字化时代&#xff0c;网络安全和隐私保护日益受到重视。静态IP代理作为一种网络服务&#xff0c;为用户提供了一个稳定且可预测的网络连接方式&#xff0c;同时保护了用户的在线身份。本文将从五个方面深入探讨静态IP代理的概念、优势、应用场景、技术实现以及选择时的考量…

【传知代码】VRT: 关于视频修复的模型(论文复现)

前言&#xff1a;随着数字媒体技术的普及&#xff0c;制作和传播视频内容变得日益普遍。但是&#xff0c;视频中由于多种因素&#xff0c;例如传输、存储和录制设备等&#xff0c;经常出现质量上的问题&#xff0c;如图像模糊、噪声干扰和低清晰度等。这类问题对用户的体验和观…

【JAVA】嵌入式软件工程师-2025校招必备-详细整理

一、Java 基础 1.JDK 和 JRE 有什么区别&#xff1f; jdk&#xff1a;java development kit jre&#xff1a;java runtime Environment jdk是面向开发人员的&#xff0c;是开发工具包&#xff0c;包括开发人员需要用到的一些类。 jre是java运行时环境&#xff0c;包括java虚拟机…

困惑点记录

【第十章 总结思考】CIM之我见 - 知乎

STK中的光照计算模型

本文简要阐述STK中光照计算的模型。 在航天任务中&#xff0c;通常需要分析地面站、飞行器在一定时间内的光照情况&#xff0c;具体包括&#xff1a; 地面站处在光照区和阴影区的具体时间范围&#xff1b;考虑地形遮挡后&#xff0c;地面站的光照区和阴影区的变化情况&#x…

解决kali Linux安装后如何将语言修改为中文

开启虚拟机 用root用户进入终端 进入终端执行dpkg-reconfigure locales命令 选择en_US.UTF-8 UTF-8选项&#xff0c;按空格键将其取消。 选择zh_CN.UTF-8 UTP-8&#xff0c;按空格选择&#xff0c;按tab键选择ok。 选择zh_CN.UTF-8字符编码&#xff0c;按tab键选择ok&#xff0…

【漏洞复现】Secnet-智能路由系统 actpt_5g.data信息泄露

0x01 产品简介 Secnet安网智能AC管理系统是广州安网通信技术有限公司(简称“安网通信”)的无线AP管理系统 0x02 漏洞描述 Secnet智能路由系统 acipt 5g.data 接口存在信息泄露漏洞&#xff0c;未经身份验证的远程攻击者可以利用此漏洞获取系统账户名密码等重要凭据&#xff…

社区服务用工具建立与居民的强关系

在数字化时代的浪潮下&#xff0c;社区服务不再局限于传统的面对面交流模式&#xff0c;而是借助互联网医疗健康服务应用&#xff0c;尤其是智慧康养服务平台&#xff0c;构建起了与居民之间更为紧密、便捷的联系。这种新型的社区服务模式&#xff0c;不仅提升了服务效率&#…

wsl2安装rancher并导入和创建k8s集群

环境准备 安装wsl2点击此文]ubuntu20.04安装docker 点击此文,安装完成后docker镜像仓库改成阿里云镜像加速地址.如果不熟请点击此文 docker 安装rancher 启动wsl,根据官方文档以root身份执行 sudo docker run -d --restartunless-stopped -p 80:80 -p 443:443 --privileged …

第13节 第二种shellcode编写实战(2)

我最近在做一个关于shellcode入门和开发的专题课&#x1f469;&#x1f3fb;‍&#x1f4bb;&#xff0c;主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料&#xff0c;内容里面的每一个环境我都亲自测试实操过的记录&#xff0c;有需要的小伙伴可以参考…

错误: 找不到或无法加载主类问题(已解决)

今天在虚拟机中安装了idea2023.2的版本&#xff0c;运行代码时发现错误找不到主类&#xff01; 直接说结论&#xff1a; 我先clean了一下target&#xff0c;然后重新build&#xff0c;发现maven报错了&#xff0c;idea2023.2默认使用了内置的maven&#xff0c;然后我切换了一下…

Shell之(数组)

目录 一、shell数组 1.数组的定义 2.定义数组的方法 第一种 第二种 第三种 第四种 3.数组分片 4. 数组字符替换 临时替换 永久替换 5.删除数组 删除指定的下标 删除整组 6.数组遍历和重新定义 7.数组追加元素 方式一&#xff1a;指定位置添加 方法二&a…

【JAVA入门】Day05 - 面向对象

【JAVA入门】Day05 - 面向对象 文章目录 【JAVA入门】Day05 - 面向对象一、对象的设计和使用1.1 类和对象1.2 类的分类 二、封装三、private 关键字四、this 关键字五、构造方法六、JavaBean七、对象的内存图7.1 一个对象的内存图7.2 两个对象的内存图7.3 两个引用指向同一个对…

文心一言 VS 讯飞星火 VS chatgpt (252)-- 算法导论18.2 5题

五、因为叶结点无需指向孩子结点的指针&#xff0c;那么对同样大小的磁盘页面&#xff0c;可选用一个与内部结点不同的(更大的) t 值。请说明如何修改 B 树的创建和插人过程来处理这个变化。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 当我们在B树&#xff…