首页 > 其他分享 >JS中Map、WeakMap和Object的区别

JS中Map、WeakMap和Object的区别

时间:2023-04-17 12:24:44浏览次数:33  
标签:Map obj Object WeakMap 键值 key

JavaScript中的Map、WeakMap和Object都是用于存储键值对的数据结构:

1. Map:Map是一种新的数据结构,它允许使用任何数据类型(包括对象和基本数据类型)作为键。Map的一些特性包括:

- 保持键的插入顺序:当遍历Map时,键值对会按照插入顺序返回。
- 键可以是任意类型:与Object不同,Map的键可以是任意类型的值,如对象、函数或基本类型。
- 大小可获取:可以通过Map的size属性轻松获取Map的大小。

2. WeakMap:WeakMap是一种特殊类型的Map,它的键只能是对象,并且不会阻止垃圾回收。WeakMap的一些特性包括:

- 键必须是对象:与Map不同,WeakMap的键必须是对象类型。
- 无法阻止垃圾回收:当WeakMap中的某个键值对的键不再被引用时,该键值对会被自动删除。这使得WeakMap在处理潜在的内存泄漏问题时非常有用。
- 不可枚举:WeakMap没有方法可以获取其所有键值对,因此不能对其进行遍历。
- 大小不可获取:WeakMap没有size属性,因此无法直接获取其大小。

3. Object:Object是JavaScript中最常用的数据结构。Object用于存储键值对,但它有一些局限性。Object的特性包括:

- 键必须是字符串或Symbol:Object的键只能是字符串或Symbol类型。如果使用其他类型作为键,它们会被自动转换为字符串。
- 无法保证键的顺序:虽然大多数现代JavaScript引擎会按照插入顺序存储键,但这并非是标准规定的行为。
- 原型链:Object具有原型链,这可能会导致属性名称冲突。
- 无法直接获取大小:Object没有size属性,因此要获取Object的大小需要手动计算。

 


 

下面是Map、WeakMap和Object之间的区别:

1. 键的类型:

Map的键可以是任何类型,WeakMap的键必须是对象类型,而Object的键必须是字符串或Symbol类型。

2. 垃圾回收:

Map中的键是强引用,即使键对象没有其他引用,也不会被垃圾回收。而WeakMap中的键是弱引用,当键对象没有其他引用时,可能会被垃圾回收。Object中的属性是强引用,即使没有其他引用,也不会被垃圾回收。

3. 可枚举性:

Object的属性是可枚举的,可以使用for-in或Object.keys()等方法来遍历属性。而Map和WeakMap中的键是不可枚举的。

4. 方法和操作:

Object具有一些特定于对象的方法和操作,例如Object.keys()和Object.values()等。Map和WeakMap提供了一些特定于映射的方法和操作,例如Map.has()和WeakMap.delete()等。

5. 继承:

Object具有原型继承,即属性可以从原型链中继承。而Map和WeakMap不具有原型继承,它们是独立的数据结构。

使用场景:

- 当需要使用非字符串键时,可以使用Map。
- 当需要存储与对象相关联的元数据时,可以使用WeakMap。
- 当需要存储对象属性时,可以使用Object。
- 当需要避免内存泄漏和手动释放内存时,可以使用WeakMap。
- 当需要遍历和操作属性时,可以使用Object。

 


 


下面是一些使用Map、WeakMap和Object的示例:

1. 使用Map:

// 创建一个Map
const map = new Map();

// 添加键值对
map.set('name', 'John');
map.set(42, 'Age');
map.set({ key: 'objectKey' }, 'This is an object key');

// 获取值
console.log(map.get('name')); // 输出:John

// 遍历Map
map.forEach((value, key) => {
  console.log(`${key}: ${value}`);
});
// 输出:
// name: John
// 42: Age
// [object Object]: This is an object key

// 获取Map大小
console.log(map.size); // 输出:3

 

2. 使用WeakMap:

// 创建一个WeakMap
const weakMap = new WeakMap();

// 创建对象作为键
const obj1 = { id: 1 };
const obj2 = { id: 2 };

// 添加键值对
weakMap.set(obj1, 'Object 1');
weakMap.set(obj2, 'Object 2');

// 获取值
console.log(weakMap.get(obj1)); // 输出:Object 1

// 无法遍历WeakMap或获取其大小

 

3. 使用Object:

// 创建一个Object
const obj = {};

// 添加键值对
obj['name'] = 'John';
obj[42] = 'Age';
obj[{ key: 'objectKey' }] = 'This is an object key'; // 这里键会被转换为字符串

// 获取值
console.log(obj['name']); // 输出:John

// 遍历Object
for (const key in obj) {
  console.log(`${key}: ${obj[key]}`);
}
// 输出:
// name: John
// 42: Age
// [object Object]: This is an object key

// 获取Object大小(需要手动计算)
console.log(Object.keys(obj).length); // 输出:3

 


综上所述,Map、WeakMap和Object都是JavaScript中用于存储键值对的数据结构,它们在键类型、垃圾回收、可枚举性、方法和操作、以及继承等方面存在一些区别,适用于不同的场景。

标签:Map,obj,Object,WeakMap,键值,key
From: https://www.cnblogs.com/ronaldo9ph/p/17325453.html

相关文章

  • js报错:devtools failed to load source map : could no load content for
    报错:DevToolsfailedtoloadsourcemap:Couldnotloadcontentforhttp://localhost:8000/css/bootstrap.min.css.map:HTTPerror:statuscode404,net::ERR_HTTP_RESPONSE_CODE_FAILURE 解决方法:F12-点击设置齿轮-取消勾选EnableJavaScriptsourcemaps和EnableCSS......
  • 网络安全与网站安全及计算机安全:如何下载到Windows各版本的Nmap网络扫描神器
    1、Nmap-7.91下载https://nmap.org/dist/nmap-7.91-setup.exe2、Nmap-7.90下载https://nmap.org/dist/nmap-7.90-setup.exe3、Nmap-7.80下载https://nmap.org/dist/nmap-7.80-setup.exe4、Nmap-7.70下载https://nmap.org/dist/nmap-7.70-setup.exe5、Nmap-7.60下载https://nmap.org......
  • 网络安全与Kali Linux:Sqlmap数据库注入与渗透环境搭建
    一、背景介绍DVWA(DamnVulnerableWebApp)是一个基于PHP/MySql搭建的Web应用程序,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助Web开发者更好的理解Web应用安全防范的过程。DVWA一共包含十个模块分别是:1.BruceForce//暴力破解1.CommandInjection//命令......
  • 网络安全与Kali Linux:如何使用Nmap探测网络空间存活主机?
    一、背景介绍nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。本文通过介绍三款工具(nmap、fping、ettercap)分别对......
  • 网络安全与Kali Linux:Nmap网络扫描高级使用技巧
    课前声明:本分享仅做学习交流,请自觉遵守法律法规!搜索:Kali与编程,学习更多网络攻防干货!下篇文章将在明天下午五点发布,敬请关注!一、背景介绍SYN扫描,原理为:(1):本地主机向目标主机发送一个SYN数据段.(这里牵扯到TCP报文结构的问题,在TCP报文中SYN标志位用来建立连接,让连接的双方......
  • MFC-GetObject获取对象信息
    获取位图信息BITMAPbm;HBITMAPhBmp=NULL;CStringstr=_T("D:\\1.bmp");hBmp=(HBITMAP)::LoadImage(NULL,str,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);intn=::GetObject(hBmp,sizeof(BITMAP),(PSTR)&bm);//获取对象信息/*......
  • mapbox-gl实战教程:地图定位
    在地图开发中,定位是进行的比较多的操作,根据操作,定位到地图上一个位置,定位到地图上的一个区域,或是定位到一条路上等等。下边以实际的代码操作,讲一下mapbox-gl如何进行定位的操作。1、点数据定位:对于点数据的定位,mapbox-gl提供了两个实现方式,一个跳转(jumpTo)到位置,一个飞到(flyTo)指......
  • g_dbus_connection_register_object
    /***g_dbus_connection_register_object:*@connection:A#GDBusConnection.*@object_path:Theobjectpathtoregisterat.*@interface_info:Introspectiondatafortheinterface.*@vtable:A#GDBusInterfaceVTabletocallintoor%NULL.*@user_data:Da......
  • sqlmap
    sqlmap快速入门–FreeBuf网络安全行业门户SQLMAP详细参数详解–FreeBuf网络安全行业门户Sqlmap中文手册若水斋-CSDN博客sqlmapsqlmap:自动SQL注入和数据库接管工具公司简介·sqlmapproject/sqlmapWiki·GitHub用法·sqlmapproject/sqlmapWiki·GitHub1、介绍sqlma......
  • MFC-SelectObject新对象替换相同类型的对象
     HDChdc=::GetDC(m_hWnd);LOGFONTlf={0};lf.lfWeight=16;//平均宽度lf.lfHeight=40;//字体高度lf.lfCharSet=GB2312_CHARSET;HFONThfont=::CreateFontIndirect(&lf);HFONTholdfont=(HFONT)SelectObject(hdc,hfon......