js map遍历 修改对象里面的值_JavaScript Map对象

本文详细介绍了JavaScript中的Map对象,包括其特点、与对象的区别、使用方法如声明、添加、获取、删除、转换及遍历。此外,还提到了WeakMap的特性和用途,强调了在键值对中键的弱引用性质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript Map对象

Map

Map是一组键值对的结构,用于解决以往不能用对象做为键的问题

具有极快的查找速度

函数、对象、基本类型都可以作为键或值

其实Map和对象非常相似,但是对象的键只能是String类型或Symbol类型,Map在这方面就显得自由开放,以下是Map与对象的对比。

MapObject

意外的键

Map默认情况不包含任何键。只包含显式插入的键。

一个 Object有一个原型, 原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。注意:虽然 ES5 开始可以用 Object.create(null)来创建一个没有原型的对象,但是这种用法不太常见。

键的类型

一个 Map的键可以是任意值,包括函数、对象或任意基本类型。

一个Object

键的顺序

Map中的 key 是有序的。因此,当迭代的时候,一个 Map对象以插入的顺序返回键值。

一个 Object的键是无序的注意:自ECMAScript 2015规范以来,对象确实保留了字符串和Symbol键的创建顺序; 因此,在只有字符串键的对象上进行迭代将按插入顺序产生键。

Size

Map的键值对个数可以轻易地通过size属性获取

Object的键值对个数只能手动计算

迭代

Map是 iterable的,所以可以直接被迭代。

迭代一个Object需要以某种方式获取它的键然后才能迭代。

性能

在频繁增删键值对的场景下表现更好。

在频繁添加和删除键值对的场景下未作出优化。

声明定义

使用Map()加上数组嵌套即可声明出一个Map容器。

"use strict";

let map= new Map([["k1", "v1"], ["k2", "v2"], ["k3", "v3"]]);

console.log(mapinstanceof Map); //true

console.log(map);//Map(3) {"k1" => "v1", "k2" => "v2", "k3" => "v3"}

对于键是对象的Map, 键保存的是内存地址,值相同但内存地址不同的视为两个键。这个时候是不会引发值冲突的问题,如果是相同内存地址的对象则会引发值冲突。

"use strict";

let arr= ["云崖"]; //一个arr设置为了两个不同的键,这会引发值冲突的问题。

let map= new Map([[arr, "v1"], ["k2", "v2"], [arr, "v3"]]);

console.log(map);//Map(2) {Array(1) => "v3", "k2" => "v2"}

新增数据

使用set()方法为Map容器新增一组键值对。

?

let map= newMap();

?

map.set("k1","v1");

map.set("k2","v2");

?

console.log(map);//Map(2) {"k1" => "v1", "k2" => "v2"}

?

获取数量

使用size属性获取当前map容器中键值对的数量。

?

let map= newMap();

?

map.set("k1","v1");

?

map.set("k2","v2");

?

console.log(map.size);//2

?

元素检测

使用has()方法检测当前map容器中是否存在某个键,返回布尔值。

注意:如果键是引用类型则必须要使用原本键对象的引用才行,单纯的形式相似是会返回false。

?

let arr= new Array("云崖")

?

let map= newMap();

?

map.set(arr,"v1");

?

map.set("k2","v2");

?

console.log(map.has(arr));//true 来自同一引用

console.log(map.has(["云崖"])); //false 不来自同一引用,这里的数组是新开辟的内存空间

?

获取元素

使用get()方法获取map容器中的一组键值对。

?

let arr= new Array("云崖")

?

let map= newMap();

?

map.set(arr,"v1");

?

map.set("k2","v2");

?

console.log(map.get(arr));//v1

?

console.log(map.get(["云崖"])); //undefined

?

删除元素

使用delete()方法删除map容器中的一组键值对。

返回布尔值,true代表删除成功,false代表删除失败。

?

let arr= new Array("云崖")

?

let map= newMap();

?

map.set(arr,"v1");

?

map.set("k2","v2");

?

console.log(map.delete(arr)); //true

?

清空容器

使用clear()方法可以使map容器清空。

?

let arr= new Array("云崖")

?

let map= newMap();

?

map.set(arr,"v1");

?

map.set("k2","v2");

?

map.clear()

?

console.log(map);//Map(0) {}

?

数组转换

可使用...语法或者Array.from()将Map转换为Array。

20200730013011496237.png

遍历操作

迭代器创建

使用 keys()/values()/entries()都可以返回可遍历的迭代对象。

?

let map= new Map([["k1","v1"],["k2","v2"],["k3","v3"]]);

?

console.log(map.keys());//拿到所有键

?

console.log(map.values());//拿到所有值

?

console.log(map.entries());//拿到所有键值对

?

20200730013011747197.png

forEach

使用forEach遍历操作。

?

let map= new Map([["k1", "v1"], ["k2", "v2"], ["k3", "v3"]]);

?

map.forEach(function(key, value) {

console.log(key,value);

});

?

20200730013011834106.png

for/of

使用for/of遍历操作,直播遍历map容器等同于使用遍历entries()函数

?

let map= new Map([["k1", "v1"], ["k2", "v2"], ["k3", "v3"]]);

?for(let [key, value] of map) {

console.log(key, value);

}

?

20200730013011834106.png

WeakMap

WeakMap对象是一组键/值对的集

键名必须是对象

WeakMap对键名是弱引用的,键值是正常引用

垃圾回收不考虑WeakMap的键名,不会改变引用计数器,键在其他地方不被引用时即删除

因为WeakMap是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作

也是因为弱引用,WeakMap结构没有keys(),values(),entries()等方法和 size属性

当键的外部引用删除时,希望自动删除数据时使用 WeakMap

声明定义

在 WeakMap中的键值只能是容器类型的对象,即引用类型,不能是值类型。

?

let array= [1,2,3];

?

let dict= {"k1":"v1","k2":"v2"};

?

let map= new WeakMap([[array,"k1"],[dict,"k2"]]);

?

console.log(map);//WeakMap {Array(3) => "k1", {…} => "k2"}

?

值类型作为键会抛出异常。

?

let array= [1,2,3];

?

let dict= {"k1":"v1","k2":"v2"};

?

let map= new WeakMap([[array,"k1"],[dict,"k2"],[3,"k3"]]);

?

console.log(map);//Uncaught TypeError: Invalid value used as weak map key

?

操作方法

方法说明

add()

添加一组键值对,键必须是引用类型的对象。

delete()

删除一组键值对

has()

判断是否存在一个引用类型对象的键值对

垃圾回收

对于标记清除法来说,存在于WeakMap中的对象键并不会为其增加引用计数,因此也被称之为弱引用。

当WeakMap中对象键的外部引用计数为0后,垃圾回收机制将清理 WeakMap容器中的该对象键,这会使得WeakMap容器中该对象键将被移除。

?

let array= [1, 2, 3];

?

let dict= { "k1": "v1", "k2": "v2"};

?

let map= new WeakMap([[array, "v1"],[dict,"v2"]]);

?

console.log(map);//array还在里面

?

array= null; //清理,引用计数为0

?

setInterval(()=>{

?

console.log(map);//array 不在了

?

},3000);

?

20200730013012256930.png

作用详解

根据WeakMap这个特性,我们可以用它来保存一下经常存取的数据。

当对象被删除后,我们不用管WeakMap容器中是否含存有该数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值