前端JavaScript篇之map和Object的区别、map和weakMap的区别

目录

  • map和Object的区别
  • map和weakMap的区别


map和Object的区别

  • Object是JavaScript的内置对象,用于存储键值对。
  • Object的键必须是字符串或符号,值可以是任意类型。
  • Map是ES6引入的新数据结构,用于存储键值对。
  • Map的键可以是任意类型,值也可以是任意类型。

Object是JavaScript中的内置对象,用于存储键值对(属性和属性值)的集合。它是一种非常常见和灵活的数据结构,可以通过点符号或方括号来访问和修改属性。

Map是ES6引入的新数据结构,也用于存储键值对的集合。与Object不同的是,Map的键可以是任意数据类型,而不仅限于字符串或符号。Map提供了更多的方法来操作和遍历键值对,例如setgethasdelete

// 使用Object存储键值对
const obj = {key1: 'value1',key2: 'value2',key3: 'value3'
}console.log(obj.key1) // 输出:"value1"// 使用Map存储键值对
const map = new Map()
map.set('key1', 'value1')
map.set('key2', 'value2')
map.set('key3', 'value3')console.log(map.get('key1')) // 输出:"value1"

请添加图片描述

在上述例子中,我们首先使用Object存储了一组键值对,其中键为字符串,值为字符串。我们可以使用点符号来访问对象的属性,例如obj.key1返回值为"value1"。

接下来,我们使用Map存储了相同的键值对。使用new Map()创建了一个新的Map对象,然后使用set方法来添加键值对。与Object不同的是,我们可以使用任意类型的键,例如字符串或数字。通过map.get("key1")可以获取到对应的值,返回值为"value1"。

MapObject是两种不同的数据结构,用于存储键值对。它们之间有一些区别和特点:

  1. 键的类型:Map的键可以是任意类型,包括对象、函数、基本类型等;而Object的键只能是字符串或符号。

  2. 键值对的顺序:Map中的键值对是有序的,即按照插入顺序进行迭代;而Object中的键值对是无序的,迭代顺序不确定。

  3. 键值对的个数:Map中的键值对个数可以通过size属性获取;而Object的键值对个数需要手动计算。

  4. 迭代方式:Map可以直接使用for...of循环进行迭代,或者使用forEach方法;而Object需要先获取键的数组,然后再进行迭代。

  5. 键的唯一性:Map中的键是唯一的,不会存在重复的键;而Object中如果使用相同的键进行多次赋值,后面的值会覆盖前面的值。

  6. 性能:在频繁增删键值对的场景下,Map的性能通常会更好,而在静态数据的场景下,Object的性能可能更好。

// 使用Map存储键值对
const map = new Map()
map.set('key1', 'value1')
map.set('key2', 'value2')
map.set('key3', 'value3')console.log(map.size) // 输出:3// 使用Object存储键值对
const obj = {key1: 'value1',key2: 'value2',key3: 'value3'
}let count = 0
for (let key in obj) {if (obj.hasOwnProperty(key)) {count++}
}console.log(count) // 输出:3

请添加图片描述
在上述示例中,我们使用MapObject分别存储了相同的键值对。通过size属性可以获取Map中键值对的个数,通过手动计算可以获取Object中键值对的个数,都为3。

map和weakMap的区别

当涉及到存储键值对的时候,JavaScript提供了两种不同的数据结构:MapWeakMap。它们都有自己的特点和用途。

Map

  • Map是一个有序的键值对集合,其中的键可以是任何类型,包括对象、函数、基本类型等。
  • Map中的键值对是通过set方法添加的,通过get方法获取对应的值。
  • Map提供了size属性来获取键值对的个数。
  • Map可以使用has方法来检查指定的键是否存在。
  • Map可以使用delete方法来删除指定的键值对。
  • Map可以使用clear方法来清空所有的键值对。
  • Map可以使用forEach方法或者for...of循环来迭代键值对。

WeakMap

  • WeakMap也是一个键值对集合,但是它的键必须是对象。
  • WeakMap中的键值对是通过set方法添加的,通过get方法获取对应的值。
  • WeakMap没有提供size属性,也没有提供直接的迭代方法。
  • WeakMap的键是弱引用的,如果键没有被其他对象引用,垃圾回收时会自动删除对应的键值对。
  • WeakMap没有提供类似hasdeleteclear等方法,因为这些方法可能会干扰垃圾回收的机制。

下面是一个使用MapWeakMap的示例:

// 使用Map存储键值对
const map = new Map()
const key1 = { name: 'John' }
const key2 = { name: 'Jane' }map.set(key1, 'value1')
map.set(key2, 'value2')console.log(map.get(key1)) // 输出:"value1"
console.log(map.size) // 输出:2
console.log(map.has(key2)) // 输出:truemap.delete(key1)
console.log(map.size) // 输出:1map.clear()
console.log(map.size) // 输出:0// 使用WeakMap存储键值对
const weakMap = new WeakMap()
const weakKey1 = { name: 'John' }
const weakKey2 = { name: 'Jane' }weakMap.set(weakKey1, 'value1')
weakMap.set(weakKey2, 'value2')console.log(weakMap.get(weakKey1)) // 输出:"value1"weakKey1.name = 'Mike'
console.log(weakMap.get(weakKey1)) // 输出:"value1",键对象属性修改不会导致键值对的删除

请添加图片描述

在上述示例中,我们使用MapWeakMap分别存储了相同的键值对。通过set方法设置键值对,通过get方法获取值。

对于Map,我们可以使用任意类型的键,例如对象key1key2,并通过set方法设置键值对,通过get方法获取值。我们还展示了size属性、has方法、delete方法和clear方法的用法。

对于WeakMap,我们同样可以使用对象作为键,例如weakKey1weakKey2。通过set方法设置键值对,通过get方法获取值。需要注意的是,如果键没有被其他对象引用,垃圾回收时会自动删除对应的键值对。键被修改后,对应的键值对被自动删除。

MapWeakMap是两种不同的数据结构,用于存储键值对。它们之间有一些区别和特点:

  1. 键的引用类型:Map的键可以是任意类型,包括对象、函数、基本类型等;而WeakMap的键必须是对象。

  2. 引用关系:Map中的键值对存在强引用关系,即使键没有被其他对象引用,也不会被垃圾回收;而WeakMap中的键值对存在弱引用关系,如果键没有被其他对象引用,垃圾回收时会自动删除对应的键值对。

  3. 迭代方式:Map可以直接使用for...of循环进行迭代,或者使用forEach方法;而WeakMap没有提供直接的迭代方法。

  4. 键的唯一性:Map中的键是唯一的,不会存在重复的键;而WeakMap中的键是弱引用,不同的对象可以拥有相同的键。

  5. 性能:WeakMap在某些场景下的性能可能会更好,因为它的键值对可以被垃圾回收,不会造成内存泄漏。

// 使用Map存储键值对
const map = new Map()
const key1 = { name: 'John' }
const key2 = { name: 'Jane' }map.set(key1, 'value1')
map.set(key2, 'value2')console.log(map.get(key1)) // 输出:"value1"// 使用WeakMap存储键值对
const weakMap = new WeakMap()
const weakKey1 = { name: 'John' }
const weakKey2 = { name: 'Jane' }weakMap.set(weakKey1, 'value1')
weakMap.set(weakKey2, 'value2')console.log(weakMap.get(weakKey1)) // 输出:"value1"

在上述示例中,我们分别使用MapWeakMap存储了相同的键值对。通过键获取对应的值,可以发现它们的使用方式是相似的。

对于Map,我们可以使用任意类型的键,例如对象key1key2,并通过set方法设置键值对,通过get方法获取值。

对于WeakMap,我们同样可以使用对象作为键,例如weakKey1weakKey2。通过set方法设置键值对,通过get方法获取值。需要注意的是,如果键没有被其他对象引用,垃圾回收时会自动删除对应的键值对。

这就是MapWeakMap的基本区别和用法。Map适用于需要存储键值对且不需要自动删除的场景;而WeakMap适用于需要存储键值对且希望自动删除的场景。

持续学习总结记录中,回顾一下上面的内容:
MapObject 都是 JavaScript 中用于存储键值对的数据结构,但它们之间有一些区别。Object 的键必须是字符串或符号,而 Map 的键可以是任何类型,包括对象和函数。Map 中的键值对是有序的,而且可以通过 size 属性获取 Map 的大小。WeakMap 只接受对象作为键,并且这些对象是弱引用的,它的值可以是任何类型。与 Map 不同的是,WeakMap 中的键值对不是可枚举的,也不能通过 size 属性获取 WeakMap 的大小。在处理大量数据时,Map 的性能比 Object 更好,而 WeakMap 的性能比 Map 更好。

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

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

相关文章

C++ 日期类的实现

目录 前言 日期类中的成员函数和成员变量 日期类中成员函数的详解和实现 1.天数前后的判断 2.天数加减的实现 3.前置 && 后置 4.计算天数差值 前言 日期类的实现将综合前面所学的(类的6个默认成员函数),进一步理解和掌握类的…

算法刷题day04

目录 一、前缀和二、子矩阵的和三、激光炸弹四、K倍区间五、总结 一、前缀和 标签:前缀和 题目描述: 输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r。对于每个询问,输出原序列中从第 l 个数到第 r…

COX预测模型过程中,我踩过的那些雷

R语言做!初学者先进来看看!!! SCI冲 COX分析:做临床信息与预后相关的COX分析大致都会分为两个步骤,先做单因素COX回归分析,再根据P值挑选有意义的变量,最终纳入COX多因素回归模型中&…

20240202在WIN10下部署faster-whisper

20240202在WIN10下部署faster-whisper 2024/2/2 12:15 前提条件,可以通过技术手段上外网!^_ 首先你要有一张NVIDIA的显卡,比如我用的PDD拼多多的二手GTX1080显卡。【并且极其可能是矿卡!】800¥ 2、请正确安装好NVIDIA最…

SpringBoot实战项目第一天

环境搭建 后端部分需要准备: sql数据库 创建SpringBoot工程,引入对应的依赖(web\mybatis\mysql驱动) 配置文件application.yml中引入mybatis的配置信息 创建包结构,并准备实体类 完成今日开发后项目部分内容如下图示 用户注册于登录部分…

[BUUCTF]-PWN:mrctf2020_easy_equation解析

查看保护 再看ida 很明了,题目就是让我们用格式化字符串漏洞修改judge的值(可以用python脚本进行计算,最终算出来得2)使等式成立,然后getshell。 虽然操作比较简单,但我还是列出了几种方法 解法一&#x…

uni-app移动端图片预览组件 movable-area 、movable-view (支持缩放,拖动效果、替换部分代码图片可直接使用)

UniApp图片预览组件 利用uni-app官方<movable-area>、<movable-view>内置视图组件 配合 uView 组件的u-popup 弹框组件共同实现封装的图片预览组件&#xff0c;支持手指缩放、拖动效果&#xff0c;替换代码中部分图片后 可以直接使用。 效果图&#xff1a; 组件代码…

【数据结构与算法】——单链表的原理及C语言实现

数据结构与算法——链表原理及C语言实现 链表的原理链表的基本属性设计创建一个空链表链表的遍历&#xff08;显示数据&#xff09;释放链表内存空间 链表的基本操作设计&#xff08;增删改查&#xff09;链表插入节点链表删除节点链表查找节点增删改查测试程序 链表的复杂操作…

Vulnhub billu b0x

0x01 环境搭建 1. 从官方下载靶机环境&#xff0c;解压到本地&#xff0c;双击OVF文件直接导入到vmware虚拟机里面。2. 将虚拟机的网络适配器调成NAT模式&#xff0c;然后开机即可进行操作了。 0x02 主机发现 nmap -sn 192.168.2.0/24 成功获取靶机IP为192.168.2.129。 0x0…

本次安装Visual Studio 所用的安装程序不完整。请重新运行VisualStudio安装程序以解决此问题

今天点开VS的时候遇到了这个问题 因为昨天升级到一半电脑关机了&#xff0c;今天打开软件遇到如下错误&#xff0c; 解决办法很简单&#xff0c;找到安装目录进入Installer文件夹 我的目录在C:\Program Files (x86)\Microsoft Visual Studio\Installer 找到vs_installer.exe…

【python】python爱心代码

一、实现效果&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 二、准备工作 &#xff08;1)、导入必要的模块&#xff1a; 代码首先导入了需要使用的模块&#xff1a;requests、lxml和csv。 import requests from lxml import etree import csv 如果出现…

查找单词-算法(深度优先)

题目 给定一个二维数组与一个单词&#xff0c;数组中每个元素为大写字母&#xff0c;判断单词是否出现在数组中。 如二维数组&#xff1a; char[][] map {{A, B, C, E}, {S, F, C, S}, {A, D, E, E}}; 目标单词&#xff1a; ABCCEE 解题 深度优先&#xff0c;并且走过的…

03哈希表:242、有效的字母异位词

242、有效的字母异位词 文章目录 242、有效的字母异位词方法一&#xff1a;暴力破解法方法二、 哈希法 重点&#xff1a;哈希可以用数组代替表示&#xff0c;下标用与a的位置绝对值 暴力破解法&#xff1a;两层for循环&#xff0c;同时记录字母次数哈希法&#xff1a;第一个字符…

C#写个小工具,把多个word文档进行合并成一个word文档

先要安装包 帮助类WordDocumentMerger&#xff0c;用于处理word合并功能 using System; using System.Collections.Generic; using System.Text; using Microsoft.Office.Interop.Word; using System.Reflection; using System.IO; using System.Diagnostics;namespace WordH…

分别用JavaScript,Java,PHP,C++实现桶排序的算法(附带源码)

桶排序是计数排序的升级版。它利用了函数的映射关系&#xff0c;高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效&#xff0c;我们需要做到这两点&#xff1a; 在额外空间充足的情况下&#xff0c;尽量增大桶的数量使用的映射函数能够将输入的 N 个数据均匀的分…

关闭windows系统的自动更新的6种方法 详细介绍

关闭Windows系统的自动更新可以通过多种方法实现&#xff0c;以下将详细介绍六种不同的方法。请注意&#xff0c;关闭自动更新可能会使您的系统面临安全风险&#xff0c;因为您将不会及时接收到最新的安全补丁和系统更新。在执行以下任何操作之前&#xff0c;请确保您了解潜在的…

多线程读写文件问题

多线程读写同个文件会不会有访问冲突或者异常&#xff1f;我们写个程序来测试一下 /*** Created by fangruibin* 测试多线程读写文件*/#include <iostream> #include <pthread.h> #include <unistd.h> #include <string.h>const char* fileName &quo…

【C语言】字符串函数介绍

目录 前言&#xff1a; 1. strlen 函数 函数介绍 strlen 函数的使用 strlen 函数的模拟实现 2. strcpy 函数 函数介绍 strcpy 函数的使用 strcpy 函数的模拟实现 3. strcat 函数 函数介绍 strcat 函数的使用 strcat 函数的模拟实现 4. strcmp 函数 函数介绍 st…

前端工程化之:webpack1-12(常用扩展)

目录 前言 一、CleanWebpackPlugin 二、HtmlWebpackPlugin 三、CopyPlugin 四、webpack-dev-server 五 、file-loader 六、url-loader 七、路径问题 前言 由于 webpack 、 webpack-cli 、 webpack-dev-server 会存在版本不兼容问题&#xff0c;所以这里使用的版本如下&…

4K Video Downloader forMac/win:畅享高清视频下载的终极利器!

在如今的数字时代&#xff0c;高清视频已经成为人们生活中不可或缺的一部分。无论是观看精彩的电影、音乐视频&#xff0c;还是学习教育类的在线课程&#xff0c;我们都希望能够以最清晰流畅的方式来欣赏。而为了满足这一需求&#xff0c;我们需要一款功能强大的高清视频下载软…