首先Map是出于es6中的规范,其本身就是一个构造函数
一、Map和普通的object对象对比
1.map对象的key可以是任何数据类型,object对象的key只能是字符串
2.map可以通过size属性获取长度,object只能通过循环遍历
二、基本Map特性
new Map()创建新的 Map 对象。
set()为 Map 对象中的键设置值。
(注意: 设置引用类型数据,key是引用指向,比如:let myMap = new Map();let a = {'a': 1};myMap.set(a, 123);console.log(myMap.get({'a': 1})) // undefined; )
get()获取 Map 对象中键的值。
(注意:Map的键中NaN === NaN,并且0 === +0 === -0)
entries()返回 Map 对象中键/值对的数组。
keys()返回 Map 对象中键的数组。
values()返回 Map 对象中值的数组。
三、更多Map特性
clear()删除 Map 中的所有元素。
delete()删除由键指定的元素。
has()如果键存在,则返回 true。
forEach()为每个键/值对调用回调。
四、对比Object对象和Map对象内存占用以及性能
1.内存占用
Object和Map的 工程级实现在不同浏览器中存在明显差异,但存储单个键值对所占用的内存数量都会随键的数量线性增加。给定固定大小的内存,Map大约可以比Object多存储50%的键值对。
2.性能
插入性能——消耗大致相当,Map在某些浏览器会快一些,若涉及大量代码,Map的性能更加
查找速度——与插入不同,在大型Object和Map中查找键值对的性能差异极小,但如果只包含少量键值对,则Object更快。在把Object当数组使用时,浏览器引擎可以进行优化,内存的使用更高效
删除性能——Map的delete()操作快
五、WeakMap对象
只能将对象作为健,并在删除key后会释放内存,并且没有size属性,表现为弱键和不可迭代键
弱引用:当删除引用后释放内存,map对象则因强引用不会清除内存
不可迭代:WeakMap对象的key在任何时候都可能被销毁,没必要提供迭代其键值对的能力。WeakMap实例之所以限制只能使用对象作为键,是为了保证只有通过键对象的引用才能取得值。如果允许原始值,那就没办法区分初始化时使用的字符串字面量和初始化之后使用的一个相对的字符串了。因此也没有了size,entties等属性。
网友评论