本文主要记录学习什么?
- 什么是Map?
- Map和Object的区别
- 有了Map为什么还要有WeakMap呢?
- Map的实际开发场景问题考虑
什么是Map?
为了方便知道含义,我放置了Map的社区文档链接🔗。通过下面一个简单例子来了解一下:
// test1
// 第一种方式
let map = new Map();
let arr=['123'];
map.set(arr,456);
console.log('map',map,map.get(arr));
//map Map {["123"] => 456} 456
通过以上例子我们知道Map是一个可以通过set(key,value)去设置健值对,然后通过get(key)获取值的的特殊对象。
- 那么你会问:为什么是种特殊对象呢?这就要从Map和Object的区别说起了。
Map和Object的区别
- 用法对比
1、首先我们都知道Object是一个以健值对{key: value}形式成对存在的数据结构,Map则是一个以key => value这种形式成对存在的数据结构。
2、通过日常开发发现Object的key只能是字符串、数字和Symbol类型的,并且是以:的形式关联key和value的。而Map的key可以是任何类型(包括Date、Map,或者是自定义对象),是以=>指向value。
3、Map是可迭代对象,所以其中的键值对是可以通过 for of 循环或 .foreach() 方法来迭代的;而普通的对象键值对则默认是不可迭代的,只能通过 for in 循环来访问(或者使用 Object.keys(o)、Object.values(o)、Object.entries(o) 来取得表示键或值的数字)。
什么是可迭代对象?
可迭代对象(Iterables)是可以使用
for..of进行迭代的对象。 从技术上讲,可迭代对象必须实现Symbol.iterator方法。
迭代器协议定义了如何从一个对象中生成一系列的值。 当一个对象实现了next()方法时,它就成为了一个迭代器。
next() 方法必须返回一个带有两个属性的对象:value(迭代器返回的值,即下一个值)、done(如果迭代器已经完成,则返回 true 如果迭代器产生了一个新值,则返回 false)
// 创建对象
myNumbers = {};
// 使其可迭代
myNumbers[Symbol.iterator] = function() {
let n = 0;
done = false;
return {
next() {
n += 10;
if (n == 100) {done = true}
return {value:n, done:done};
}
};
}
- 性能对比
接下来我们来讨论一下 Object 和 Map 的性能。不知道你有没有听说过 Map 的性能优于 Object 的说法,
我反正是见过不少次。借用哲学和科学观点:存在的事物一定有它的必然性,那么既然有个Object为什么ES6又提出了Map呢?这就来探讨下。
以下对比为查阅资料所得。
1、内存占用 同一个条件下,Map的储存大约比Object多50%的健值对 2、性能 向 Object 和 Map 中插入新键/值对的消耗大致相同,不过插入 Map 一般会稍微快 一点儿。
与Map相比,Object在性能上存在问题,其中删除操作以性能低下而臭名昭著,而Map针对这种情况进行了优化,并且在某下情况下可以显著提高速度。其中在基准测试中,Map比Object快了约5倍
有了Map为什么还要有WeakMap呢?
- Map 的键可以是任意类型,WeakMap 只接受对象作为键(null除外),不接受其他类型的值作为键
- Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键; WeakMap 的键是弱引用,键所指向的对象可以被垃圾回收,此时键是无效的
- Map 可以被遍历, WeakMap 不能被遍历
Map的实际开发场景问题考虑
- 缓存管理:Map可以用于实现简单的缓存机制,存储键值对数据。在需要缓存数据的场景下,可以使用Map来快速存取数据,并根据需求设置缓存过期时间等策略。
- 事件监听器:Map可以用于存储事件和对应的监听器函数。在开发中,可以使用Map来管理多个事件的监听和处理函数,提高代码的可读性和维护性。
- 路由映射:在Web开发中,Map可以用于实现路由映射,将URL路径映射到对应的处理函数或组件。这样可以实现灵活的路由配置和管理。
- 数据结构转换:Map可以用于将不同数据结构之间进行转换,例如将数组转换为Map,方便进行数据的快速查找和操作。
- 多语言支持:在国际化开发中,Map可以用于存储不同语言版本的文本内容,根据用户的语言偏好动态获取对应的文本内容。
- 状态管理:Map可以用于存储应用程序的状态信息,例如用户登录状态、页面状态等。通过Map管理状态信息,可以方便地进行状态更新和访问。
- 数据分组:Map可以用于对数据进行分组存储,例如将数据按照某个属性值进行分组,方便后续对数据进行分组操作和统计分析。
- 元数据管理:Map可以用于存储元数据信息,例如对象的属性描述、数据来源等,帮助开发人员更好地理解和管理数据。