JS Map WeakMap Set WeakSet理解记录

157 阅读3分钟

Map

可以用JS中的任何类型(对象或基本类型)的值作为Key,其中值可以是JS中的任何类型,并能记住插入顺序的键值对的集合。Map中的一个键只能出现一次(集合中是独一无二的),虽然JS表达式中 NaN 不等于 NaN ,但作为Key值却是相等的(即相同的键值)。

创建Map对象:

const map = new Map();

实例常用方法和属性

  • set(key, value): 新增,返回当前map实例对象(可以链式调用)
  • get(key): 获取当前key对应的value值,返回value值
  • delete(key): 删除当前中key对应项,返加true/false(成功/失败)
  • clear(): 清空当前map实例的所有值
  • has(key): 判断当前key是否存在,返加true/false
  • keys(): 返回map实例元素的key的迭代器(所有项对应key值的集合[类数组])
  • values(): 返回map实例元素的value的迭代器(所有项对应value值的集合[类数组])
  • entries(): 返回当实例的前新的迭代器
  • forEach((key, value, map) => {}, thisArg): 按照插入顺序依次对 map 中每个键/值对执行一次给定的函数
  • 属性 size:当前map的元素条数

WeakMap

key必须是弱引用对象或对象(object类型),值可以是任意类型的一组键/值对的集合。

强弱引用:只有在 WeakMap、WeakSet是才会存在这概念 。

  • 强引用:对象引用(JS中默认对象的使用都是强引用)
  • 弱引用:对象的唯一引用(只能存在唯一一个能访问到对象的变量)

可为WeakMap对象key值:

  • 对象字面量、数组、Set、WeakSet、Map、WeakMap、方法(函数)、RegExp、正则字面量等
  • new String()、new Number()、new Boolean()、new Date() 等 (Symbol不是构造函数,不能 new Symbol())

不可为WeakMap对象key值:

  • 原始数据类型(string number null undefined boolean symbol)
  • String() Number() Boolean() Date()

创建WeakMap对象:

const weakmap = new WeakMap();

实例常用方法

  • set(key, value): 新增,返回当前weakmap实例对象(可以链式调用)
  • get(key): 获取当前key对应的value值,返回value值
  • delete(key): 删除当前中key对应项,返加true/false(成功/失败)
  • has(key): 判断当前key是否存在,返加true/false

Set

值的集合, 按照插入的顺序迭代它的元素, 其中值只能出现一次(在当前Set对象唯一)

唯一的判定: 对象判定的是引用地址,基本类型判定的是内容,虽然JS表达式中 NaN 不等于 NaN ,但作为值却是相等的

创建Map对象:

const set = new Set(arr?);

实例常用方法和属性

  • add(value): 新增,返回当前set实例对象(可以链式调用)
  • delete(value): 删除指定值,返加true/false(成功/失败)
  • clear(): 清空当前map实例的所有值
  • has(value): 判断当前key是否存在,返加true/false
  • keys(): 返回set实例元素的key的迭代器(所有项对应key值的集合[类数组])
  • values(): 返回set实例元素的value的迭代器(所有项对应value值的集合[类数组])
  • entries(): 返回当实例的前新的迭代器
  • forEach((value, set) => {}, thisArg): 按照插入顺序依次对 set 中每个键/值对执行一次给定的函数
  • 属性 size:当前set的元素条数

Set集合值的唯一性可以用于数组\字符去重

// 数组
const arr = [1,2,4,1];
const newArr = new Set(arr);
console.log(newArr); // Set(3) {1, 2, 4}
console.log(Array.from(newArr)); // (3) [1, 2, 4]
// 字符
const str = 'abcaabbcc';
const strSet = new Set(str);
console.log(strSet); // Set(3){'a', 'b', 'c'}

WeakSet

值必须是弱引用对象或对象(object类型)的集合。

可为WeakSet对象值:

  • 对象字面量、数组、Set、WeakSet、Map、WeakMap、方法(函数)、RegExp、正则字面量等
  • new String()、new Number()、new Boolean()、new Date() 等 (Symbol不是构造函数,不能 new Symbol())

不可为WeakMap对象key值:

  • 原始数据类型(string number null undefined boolean symbol)
  • String() Number() Boolean() Date()

创建WeakSet对象:

const weakSet = new WeakSet();

实例常用方法

  • add(value): 新增,返回当前weakSet实例对象(可以链式调用)
  • delete(value): 删除当前中value对应项,返加true/false(成功/失败)
  • has(value): 判断当前value是否存在,返加true/false