Map WeakMap 的常用方法 & 与Object之前的区别

3/4/2023 MapWeakMapObject

# 先认识一下

# Map

Map对象保存键值对,键是唯一的,不会重复。Map中的键和值可以是任何数据类型,不仅限于字符串或整数。还可以通过for-of循环对其遍历,同时也可以使用foreach进行遍历。

# Map的方法

使用使用 new 关键字和 Map 构造函数

const obj = {a:1}
let map = new Map([
  [10,1],
  [obj,'a1']
])
1
2
3
4
5

# set()

在初始化后可以使用set设置键值,如果键重复就修改之前键的值。

map.set(obj,999)
1

# get()

通过key获取到值,如果没有返回 undefined

 console.log(map.get(10)); // 1
 console.log(map.get(obj)); // 999
1
2

# keys()

返回一个以key的数组

console.log(map.keys()); // [10,{a:1}]
1

# values()

返回一个以value的数组

console.log(map.values()); // [1,'a1']
1

# has()

检查指定的键 key 是否存在

 console.log(map.has(obj)); // true
1

# delete()

移除 Map 对象中指定的元素。如果不为空,则将当前的键和值设为空,并且返回 true,如果不存在这个 key,则返回 false

console.log(map.delete(obj)); // true
console.log(map.delete(obj)); // false
1
2

# clear()

移除 Map 对象中的所有元素最后返回的值是 undefined

console.log(map.clear()); // undefined
1

# WeakMap

WeakMap是一种新的集合类型(弱映射),“weak”(弱),是指容易被清理

# Map的方法

WeakMap 只能是对象为key(null除外)

const obj = {a:1}
let weakMap = new WeakMap([
  [10,1],
  [obj,'a1']
])
// Uncaught TypeError: Invalid value used as weak map key
1
2
3
4
5
6

get、set、has、delete。用法和map一样。

# 弱映射

当WeakMap键所指对象没有其他地方引用的时候,它会被垃圾回收机制回收掉 因为 { p: 2 } 没有被引用,所以 log时只看见obj的键值对。

let obj = { a: 1 }
const wmap = new WeakMap([[obj, 1], [{ p: 2 }, 'p2']])
console.log(wmap); // [{key: {a:1},value:1}]
1
2
3

之后我讲obj赋值新对象,或者null,打印出无属性。因为初始化时的{ a: 1 }没有被obj引用了。

let obj = { a: 1 }
const wmap = new WeakMap([[obj, 1], [{ p: 2 }, 'p2']])
obj = { a: 2 }
console.log(wmap); // 无属性
1
2
3
4

# Object

也是键值对数据类型,但是键是字符串。

# 区别

  • Map的key可以是任意类型,WeakMap只能是对象,Object只能是字符串
  • Map可以迭代,WeakMap不能
  • Map会保留键的顺序,Object不会。
  • Object可以使用字面量、构造函数、Object.crate的形式创建。map只能通过new 关键字和构造函数创建。
Last Updated: 11/21/2023, 11:22:14 AM