Map,weakMap,Set,weakSet

85 阅读2分钟

Map

Map是一种新的集合类型,具有键值存储机制,是从键到值的映射,Map()是一个构造函数。Object对象的键只能是字符串,数值或符号,而Map的键/值可以是任何js数据类型。①给定固定大小的内存,Map可比Object多存储50%的键值对。②如果代码涉及大量的插入操作,Map性能更佳。③如果对包含少量键值对的对象做查找操作,可能Object性能更好。包含大量键值对的对象则两者差异不明显。④Map的delete()操作比插入和查找更快,相对Object也更有优势。

  • new Map():创建了一个空映射。
  • new Map([['name', 'json']]):在创建的同时初始化实例,参数为可迭代的对象,需要包含键值对数组。
const m = new Map();;
m.set('val', 'map');
m.set(1, 'number');
m.set(new Set([1, 2]), 'set');
m.set({}, 'object');

截屏2023-12-10 19.01.09.png

属性和方法

const person = new Map([['name', 'json'],['age', '18']])
person.size             // 2
person.has('sex')       // false ,检查是否有性别荐椎
person.get('sex')       // undefined,获取性别键值对
person.set('sex','man') // 插入性别键值对,返回映射实例,可以多个set() 方法链式使用
person.delete('sex')    // 删除景别键值对
person.clear()          // 清除映射中的所有键值对

顺序和迭代

Map实例会维护键值对的插入顺序,可以根据插入顺序执行迭代操作,映射实例可以提供一个迭代器(entries),能以插入顺序生成[key,value]形式的数组。可以通过entries()方法取得迭代器。

const m = new map([['key1','val1'],['key2','val2'],['key3','val3']])
// for of 循环操作有有迭代器属性的数据类型
for(let pair of m.entries()){ console.log(pair) }
// [key1,val1]
// [key2,val2]
// [key3,val3]
// entries()是默认迭代器,所以可以直接对映射实例使用扩展操作符
[...m] // [[key1,val1],[key2,val2],[key3,val3]]
// keys(),values()分别返回以插入顺序生成的键和值的迭代器
for(let key of m.keys()){ console.log(key) }
// key1
// key2
// key3
for(let val of m.values()){ console.log(val) }
// val1
// val2
// val3

weakMap