【JS学习笔记 04】Set 、WeakSet 、 Map 、WeakMap

Set

用于存储任何类型的唯一值,无论是基本类型还是对象引用

  • 只能保存值没有键名
  • 值是唯一的,重复的键名将合并为一个
  • Set值唯一判断采用严格类型检测(===)
  • 遍历顺序是添加的顺序,方便保存回调函数
  • 对象作为键名最终都会转为字符串
  • 使用add添加元素,使用delete删除元素
  • 可以使用Array.form静态方法转换为数组

Set的初始化

Set 利用 new 关键字创建
示例:

//使用new关键字创建Set,利用add 方法添加元素
let set1 = Set();
set1.add(1);
set1.add(2);
//使用数组初始化Set
let set2 = new Set([1,"1",2,3,4]);

Set 元素唯一

Set 采用严格类型约束(===为true),下面的数值1与字符串1属于两个不同的值。另外两个对象总是不相等的
示例:

let set = new Set([1,"1",2,3,4]);
console.table(set);

输出:
JSset
对于引用类型,如果两个变量引用同一块内存,那么这两个变量是严格相等的。例如:

let obj1 = {name : "john",age : 28}
let obj2 = obj1;
console.log(obj1 === obj2);
console.table(new Set([obj1,obj2]));

输出:
set

基本操作

获取元素数量

Set利用set.size获取元素数量
示例:

let set = new Set([1,"1",2,3,4]);
console.table(set.size);//输出 : 5

元素是否存在

Set利用set.has()获取元素数量

let set = new Set([1,"1",2,3,4]);
console.table(set.has(1));//输出:true

遍历

set也有forEach()方法,使用keys()/values()/entries()都可以返回迭代对象,因为set类型只有值所以keys与values方法结果一致。

let set = new Set([1,2,3]);
set.forEach((value, key) => console.log(key + ' : ' + value));

set

添加、删除

let set = new Set(['创新实验室','学习js']);

//添加元素
set.add(1);
set.add(2);
console.table(set);
//删除元素
set.delete(1);
console.table(set);

//清除所有元素
set.clear();
console.table(set);

输出:
JSset

过滤

可以使用点语法Array.form静态方法将Set类型转为副本,这样就可以使用拆分处理函数了
过滤掉Set中大于5的数值:示例:

let set = new Set([1,3,2,4,6,5,7,8,9]);
set = new Set([...set].filter(item => item < 5));
console.table(set);

输出:
set

交集、并集、差集

let a = new Set([1,2,3]);
let b = new Set([4,3,2]);
 //并集
let union = new Set([...a, ...b]);
console.table(union);
 //交集
let intersect = new Set([...a].filter(x => b.has(x)));
console.table(intersect);
 //差集
let difference = new Set([...a].filter(x => !b.has(x)));
console.table(difference);

输出:
set

利用set特性 实现去重

let str = "这是一串重复重复的字符字符字符";
let arr = [1,2,1,4,3,3,2,4];
console.log([...new Set(str)].toString());
console.table([...new Set(arr)]);

输出:
set

WeakSet

WeakSet结构同样不会存储重复的值,它的成员必须只能是对象类型的值,否则将报错

  • 垃圾回收不考虑WeakSet,即被WeakSet引用时引用计数器不加一,所以对象不被引用时不管WeakSet是否在使用都将删除
  • 因为WeakSet 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作
  • 因为弱引用,WeakSet 结构没有keys( ),values( ),entries( )等方法和size属性
  • 因为是弱引用所以当外部引用删除时,希望自动删除数据时使用 WeakMap
  • WeakSet的大部分操作与Set差不多

基本操作

WeakSet的大部分操作与Set差不多

const ws = new WeakSet();
const arr = ["this is a str"];
//添加操作
ws.add(arr);
console.log(ws.has(arr));

//删除操作
ws.delete(arr);

//检索判断
console.log(ws.has(arr));

垃圾回收

WeaSet保存的对象不会增加引用计数器,如果一个对象不被引用了会自动删除。

Map

Map是一组键值对的结构,函数、对象、基本类型都可以作为键或值

初始化

  • 可以接受一个数组作为参数,该数组的成员是一个表示键值对的数组。
let map = new Map([
    ["name","john"],
    ["age","20"]
]);
console.table(map);

输出:
JSmap

  • 使用set 方法添加元素,可以连续添加
let map = new Map();
map.set("name","mike").set("age",20);
console.table(map);

基本操作

  • 获取数量 map.size : 属性,返回元素数量
  • 元素检测 map.has(key): 传入键值,返回该元素是否存在的布尔值
  • 增删查
    方法名参数说明
    map.get(key)key : 键值根据键值读取元素
    map.set(key,value)key : 键值,value : 值添加一个map元素
    map.set.delete(key)key : 键值删除一个map元素
    map.set.clear()清除所有元素

遍历

  • 使用map.keys()/map.values()遍历
let map = new Map([
    [1 , "一"],
    [2 , "二"],
    [3 , "三"],
    [4 , "四"],
    [5 , "五"]
]);

//遍历键值
for (const key of map.keys()) {
    console.log(key);
}

//遍历值
for (const value of map.values()) {
    console.log(value);
}
  • 使用map.forEach()
let map = new Map([
    [1 , "一"],
    [2 , "二"],
    [3 , "三"],
    [4 , "四"],
    [5 , "五"]
]);
//1. key.value 
map.forEach((key,value) =>

console.log(`${key} : ${value}`)
);
//2. entries返回迭代器
map.forEach((entries,value) =>
    console.log(`${entries} : ${value}`)   
);

数组转换

可以使用展开语法Array.form 静态方法将Map类型转为数组,这样就可以使用数组处理函数了
具体流程类似set

WeakMap

WeakMap 对象是一组键/值对的集

  • 键名必须是对象
  • WeaMap对键名是弱引用的,键值是正常引用
  • 垃圾回收不考虑WeaMap的键名,不会改变引用计数器,键在其他地方不被引用时即删除
  • 因为WeakMap 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作
  • 因为弱引用,WeakMap 结构没有keys( ),values( ),entries( )等方法和 size 属性
  • 当键的外部引用删除时,希望自动删除数据时使用WeakMap

基本操作

let weakMap = new WeakMap();
let obj = {
    name:"a"
};
//添加操作
weakMap.set(obj,"A");
//删除操作
weakMap.delete(obj);
//检索判断
weakMap.has(obj);

垃圾回收

WakeMap的键名对象不会增加引用计数器,如果一个对象不被引用了会自动删除。

  • 当通过weakMap.set()添加的对象被删除时内存即清除,因为WeakMap是弱引用不会产生引用计数
  • 当垃圾回收时因为对象被删除,这时WakeMap也就没有记录了
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流水线程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值