map

2021/11/29

# Map和Object比较

Map和Object

Map Object
原型链 Map原型链上默认是没有额外的属性的 Object可能会从原型上继承属性
键的类型 Map键可以是任意类型 Object的键只能是String或Symbol
size 直接取 map.size Object.getOwnPropertyNames().length或keys().length
迭代 iterator,直接for循环或forEach Object.getOwnPropertyNames()或keys(),然后再循环迭代
性能 频繁增删性能更高 无优化

# 增删改查

# size

  • 作用:显示数组长度
  • 使用:map.size
  • 返回:Number
const map = new Map([['name', 'hdy'], ['age', 18]]);
console.log(map.size); // 2
1
2

# set

  • 作用:map对象添加一个键值对
  • 调用:map.set(key, value)
  • 入参:any, any
  • 返回:Map(本对象)
  • tip:因为返回的是本对象,所以可以链式调用
  • 使用
const map = new Map([['name', 'hdy']]);

console.log(map.set('age', 18));      // Map(2) { 'name' => 'hdy', 'age' => 18 }
console.log(map.set('name', '张三')); // Map(2) { 'name' => '张三', 'age' => 18 }
1
2
3
4
  • 链式调用
const map = new Map();

map.set('name', 'hdy').set(undefined, '不知道是什么属性');
console.log(map); // Map(2) { 'name' => 'hdy', undefined => '不知道是什么属性' }
1
2
3
4

# get

get

  • 作用:用键取值
  • 调用:map.get(key)
  • 入参:any
  • 返回:any


 

const fn = () => {};
const map = new Map([[fn, ]]);
console.log(map.get(fn)); // undefined
1
2
3

# has

  • 作用:用键判断是否存在该项
  • 调用:map.has(key)
  • 入参:any
  • 返回:any
const map = new Map([['name', 'hdy']]);
console.log(map.has('name')); // true
console.log(map.has('age')); // false
1
2
3

# delete

  • 作用:通过键删除项
  • 调用:map.delete(key)
  • 入参:any
  • 返回:Boolean(是否删除成功)
const map = new Map([['name', 'hdy']]);
console.log(map.delete('name')); // true
console.log(map.delete('name')); // false
1
2
3

# clear

  • 作用:清空map
  • 调用:map.clear()
  • 返回:undefined
const map = new Map([['name','hdy'],['age',18]]);
console.log(map.size); // 2
map.clear();
console.log(map.size); // 0
1
2
3
4

# 迭代器

# keys

  • 作用:拿到所有的键的迭代器
  • 调用:map.keys()
  • 返回:Iterator
const map = new Map([['name', 'hdy'], ['age', 18]]);
console.log(map.keys().next().value); // 'name'
1
2

# values

  • 作用:拿到所有的值的迭代器
  • 调用:map.values()
  • 返回:Iterator
const map = new Map([['name', 'hdy'], ['age', 18]]);
console.log(map.values().next().value); // 'hdy'
1
2

# entries

  • 作用:拿到所有键值对的迭代器
  • 调用:map.entries()
  • 返回:Iterator
const map = new Map([['name', 'hdy'], ['age', 18]]);
const entries = map.entries();
console.log(entries.next().value); // ['name', 'hdy']
1
2
3

# forEach

  • 作用:按顺序遍历map所有元素,执行对应函数
  • 调用:map.forEach(function(value, key, map) {}[, thisArg])
  • 入参:Function[, Object]
  • 返回:undefined

 

const map = new Map([['name', 'hdy'], ['age', 18]]);
map.forEach((value, key, map) => console.log(`${key}:${value}`)); // name:hdy age:18
1
2

# Symbol.iterator

  • 作用:拿到Map的迭代器对象
  • 调用:map[Symbol.iterator] ()
  • 返回:Iterator
  • tip:默认是entries函数
  • tip:for...of调用的是Symbol.iterator,所以也是拿的entries函数返回类型

# WeakMap

  • WeakMap出现是为了解决内存泄露问题

键为对象的时候,存入Map就相当于使用了一次这个对象的引用。假如这个对象已经被删除了(:外部已经赋值null了,或者dom元素删除了),而这个Map里面还是拿着这个对象的引用,那么这个对象就永远也不会被垃圾回收机制删除掉。除非手动清除Map

  • WeakMap键必须是对象,因为就是为了解决这个问题的:WeakMap拿着这个对象的弱引用,假如这个对象被删除了,这个弱引用的key不算一次引用,计数器将正确执行垃圾回收机制,清除对象,并且key将失效。所以WeakMap不能枚举
  • 拥有方法:get、set、has、delete
上次更新: 11/1/2024