JavaScript当中的Map(一)

114 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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当中使用的比较算法为零值相等算法

在零值相等算法当中,NANNAN是相等的。而其他的比较则使用===运算符来进行比较,如果相等则相等,不相等则不相等。在当前的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的差异

MapObject
意外的键Map对象一般不报错意外的键,只包含插入的键Object对象当中包含原型上的键,可能会迭代出意外的键,或者存在命名冲突
键的类型Map的键值可以是任何类型包括函数、数组、对象、基本类型Object当中的键必须是String或者Symbol
键的顺序Map当中的键是存在顺序的,一般以插入的顺序返回Object的键一般来说也是有序但是在某些情况下这个顺序是复杂的,所以最好不要依赖这个顺序
SizeMap 的键值对个数可以轻易地通过 size 属性获取。Object 的键值对个数只能手动计算.
迭代Map 是 可迭代的,所以可以直接被迭代。Object并没有实现迭代协议,所以for...of方法并不能直接迭代Object
性能在频繁增删键值对的场景下表现更好。在频繁添加和删除键值对的场景下未作出优化。
序列化和解析没有元素的序列化和解析的支持。原生的由 Object 到 JSON 的序列化支持,使用JSON.Stringfly()