持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
JavaScript当中的Map
什么是Map
Map是JavaScript当中一种新的数据存储结构。Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者基本类型)都可以作为一个键或一个值。我们可以传入{key,Value}
来当作一个键,同时也可以传递{key,value}
来当值,当我们需要获取值的之后,只需要通过键来获取就好了。
一个Map对象按照插入顺序来进行迭代,使用for....of
来进行迭代。每个迭代的对象的输出格式为[key,value]
//创建Map对象
const map = new Map();
// 插入数值
map.set('a',10);
map.set('b',11);
map.set('c',12);
map.set('d',13);
map.set('e',14);
map.set('f',15);
// 迭代Map对象
for(let item of map){
console.log(item);
}
// [ 'a', 10 ]
// [ 'b', 11 ]
// [ 'c', 12 ]
// [ 'd', 13 ]
// [ 'e', 14 ]
// [ 'f', 15 ]
键值比较
Map
当中使用的比较算法为零值相等算法
。
在零值相等算法当中,NAN
和NAN
是相等的。而其他的比较则使用===
运算符来进行比较,如果相等则相等,不相等则不相等。在当前的ECMAscript当中,-0
和+0
是相等的。
Map实例对象
我们想要使用Map
必须先构建一个Map
的实例对象new Map(iterable)
,其中iterable
是初始化构建的参数,可以传入一个数组或者其他的可迭代对象,其元素为键值对(两个元素的数组,比如[['a',1]])
// 构建一个map实例对象,并且进行初始化。
const map = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
])
Map和Object的差异
Map | Object | |
---|---|---|
意外的键 | Map对象一般不报错意外的键,只包含插入的键 | Object对象当中包含原型上的键,可能会迭代出意外的键,或者存在命名冲突 |
键的类型 | Map的键值可以是任何类型包括函数、数组、对象、基本类型 | Object当中的键必须是String 或者Symbol |
键的顺序 | Map当中的键是存在顺序的,一般以插入的顺序返回 | Object的键一般来说也是有序但是在某些情况下这个顺序是复杂的,所以最好不要依赖这个顺序 |
Size | Map 的键值对个数可以轻易地通过 size 属性获取。 | Object 的键值对个数只能手动计算. |
迭代 | Map 是 可迭代的,所以可以直接被迭代。 | Object并没有实现迭代协议,所以for...of 方法并不能直接迭代Object |
性能 | 在频繁增删键值对的场景下表现更好。 | 在频繁添加和删除键值对的场景下未作出优化。 |
序列化和解析 | 没有元素的序列化和解析的支持。 | 原生的由 Object 到 JSON 的序列化支持,使用JSON.Stringfly() |