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的区别:
Object | Map |
---|---|
一个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 不存在内存泄漏的问题。
一个前端小白,若文章有错误内容,欢迎大佬指点讨论!