ES6 | 数据结构Map

122 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

ES系列文章

Map 基本语法

Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。 Map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

标题作用
has(keyObj)判断是否有 keyObj,返回boolean值
get(keyObj)和键keyObj关联的值
set(key,value)添加/修改数据
delete(keyObj)删除键值为keyObj的键值对
size统计键值对总数
let map=new Map([
    ['name','wwww'],
    ['age',22]
])
console.log(map.size)
//2
console.log(map.has('name'))
//true
console.log(map.get('name'))
//www
console.log(map.set('name','qqq'))
//Map(2) {"name" => "qqq", "age" => 22}
map.delete('name')

Map 遍历方式

  • keys() 返回一个新的 Iterator 对象。它包含按照顺序插入 Map 对象中每个元素的 key 值

  • values() 方法返回一个新的 Iterator 对象。它包含按顺序插入Map对象中每个元素的 value 值

  • entries() 方法返回一个新的包含 [key, value] 对的 Iterator ? 对象,返回的迭代器的迭代顺序与 Map

  • 对象的插入顺序相同

  • forEach() 方法将会以插入顺序对 Map 对象中的每一个键值对执行一次参数中提供的回调函数

  • for…of 可以直接遍历每个成员

let map=new Map([
    ['name','wwww'],
    ['age',22]
])
map.forEach((value, key) => console.log(value, key))

   for (let [key, value] of map) {
       console.log(key, value)
   }

   for (let key of map.keys()) {
       console.log(key)
   }

   for (let value of map.values()) {
       console.log(value)
   }

   for (let [key, value] of map.entries()) {
       console.log(key, value)
   }

其实 Object 也是按键值对存储和读取的,下面来比较以下Object和Map的区别:

ObjectMap
一个Object的键值只能是symbol或者字符串类型Map的键值可以为任意类型,例如:函数、对象、基本类型
添加到Object中的键是无序的Map的键值对个数可以通过size属性得到
objeck的键值对个数只能手动计算Map对象是按插入的顺序返回键值
Object的迭代需要先获取它的键数组再进行迭代Map可直接进行迭代
-在涉及频繁增删改查键值对的场景下有些性能优势

WeakMap

WeakMap结构与Map结构类似,WeakMap的键名只支持引用数据类型(数组,对象,function)。

// WeakMap 可以使用 set 方法添加成员
const wm1 = new WeakMap()
const key = {
    foo: 1
}
wm1.set(key, 2)
wm1.get(key) // 2

// WeakMap 也可以接受一个数组,
// 作为构造函数的参数
const k1 = [1, 2, 3]
const k2 = [4, 5, 6]
const wm2 = new WeakMap([
    [k1, 'foo'],
    [k2, 'bar']
])
wm2.get(k2) // "bar"

WeakMap 不支持clear()方法,同时也不支持遍历。也不包含size,否则会报错。

WeakMap的键名所指向的对象,不计入垃圾回收机制。
垃圾回收机制可以简单理解为对象每被引用一次就会+1 只要对象不为0 就不会被回收 一直+1会造成内存泄漏,而WeakMap就不存在这种垃圾回收机制,即 引用了就为1 没引用就为0 不存在内存泄漏的问题。

一个前端小白,若文章有错误内容,欢迎大佬指点讨论!