javascript中Set、Map、WeakSet、WeakMap区别


Posted in Javascript onDecember 24, 2022

前言

在学习vue官方源码解析的过程中,看到了有关这一块的解析,所以跟着学习并且记录一下

Set

之前我对Set的了解还是仅仅停留在数组去重,但是我并没有在项目中用过,深入学习后,发现有时候用这个特性还挺方便的。
介绍Set之前我们先来介绍一下集合,集合是由一群无序的、不重复的元素组成的集合。
Set对象是一个由任意唯一值组成的的集合,这个唯一值可以是基本类型,也可以是引用类型,并且Set是可迭代的。

Set的使用

const set = new Set([1, 2, 3, 4, 5, 6, 5, 6]);
console.log(set);

javascript中Set、Map、WeakSet、WeakMap区别

运行代码可知Set()方法最终生成的是一个去重过后的类数组结构对象。

属性

返回类数组的元素数量

const set = new Set([1, 2, 3, 4, 5, 6, 5, 6]);
console.log(set.size); // size: 6

方法

  • add(value): 向集合中添加一个新的项
let set = new Set();
set.add(1);
console.log(set); // set: { 1 }
  • delete(value): 从集合中删除一个值
let set = new Set();
set.add(1);
set.add(2);
set.delete(1);
console.log(set); // set: { 2 }
  • has(value): 如果值在集合中存在,返回ture, 否则返回false
let set = new Set();
set.add(1);
console.log(set.has(1)); // true
console.log(set.has(2)); // false
  • clear(): 移除集合中的所有项
let set = new Set();
set.add(1);
set.add(2);
set.clear();
console.log(set.clear()) // undefined
console.log(set) // {size:0}

遍历方法

因为Set方法返回的数据结构是类数组,所以我们要使用Array,form()去将其转化为数组,也可以用ES6的结构将其转化为数组
因为Set是值的集合,它没有键,只有值,所以遍历键和值是的结果是一样的。

keys(): 返回键名的遍历器

let set = new Set([1, 2, 3, 4]);
console.log(Array.from(set.keys())); // [1,2,3,4]

values(): 返回键值的遍历器

let set = new Set([1, 2, 3, 4]);
console.log(Array.from(set.values())); // [1,2,3,4]

entries(): 返回键值对的遍历器(解构类数组)

let set = new Set([1, 2, 3, 4]);
console.log([...set.entries()]); // [[1,1],[2,2],[3,3],[4,4]]

forEach(): 使用回调函数遍历每个成员

let set = new Set([1, 2, 3, 4]);
set.forEach((item: number) => {
    console.log(item); // 轮流输出1,2,3,4
});

小结

当我们的业务需求中有数组去重时可以用,代码量少

也可以用于去交集并集差集时可以用

// 数组去重
let arr = [1, 2, 3, 4, 5, 5];
let arrSet = [... new Set(arr)]; // [1,2,3,4]

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

JS垃圾回收机制

介绍WeakSetWeakMap时得先简单的介绍一下垃圾回收机制

什么是垃圾回收机制

搞清楚什么是垃圾回收机制,首先要知道什么是垃圾,所谓的垃圾指的是不再被使用的变量和引用的对象,也有可能是对象直接相互访问,导致的死循环。那么垃圾回收机制就是不停的在寻找这些不再被使用的和不再被引用的变量,将他们清除并且释放内存。

标记清除法

现在大多数浏览器使用的都是标记清除法,当变量在运行环境中被声明时给它添加一个标记,当变量离开运行环境时清除内存并清除标记

引用计数法

当我们在创建对象时,给对象的引用计数加一,对象引用完计数减一,最终当引用计数为0时,可被垃圾回收机制回收。

WeakSet

WeakSet是对象的集合,它的成员只能是对象,并且都是弱引用的对象,如何理解弱引用,就是当对象不再被引用时,对象会被垃圾回收机制回收,所以没法确认它的成员数量,所以WeakSet它是不可迭代的,无法使用forEach等方法去遍历。

WeakSet方法

add(value): 向集合中添加一个新的项

const Weakset = new WeakSet();

const a = {};
const b = {};

Weakset.add(a);
Weakset.add(b);
console.log(Weakset);

javascript中Set、Map、WeakSet、WeakMap区别

delete(value): 从集合中删除一个值

const Weakset = new WeakSet();

const a = {};
const b = {};

Weakset.add(a);
Weakset.add(b);
Weakset.delete(b);
console.log(Weakset);

javascript中Set、Map、WeakSet、WeakMap区别

has(value) 如果值在集合中存在,返回ture, 否则返回false

const a = {};
const b = {};

Weakset.add(a);
Weakset.add(b);
Weakset.delete(b);
console.log(Weakset.has(a)); // true
console.log(Weakset.has(b)); // false

Map

记得第一次接触Map还是在做算法题的时候,当时第一题用双重for循环的话,时间复杂度为O(n^2),但是用map来处理就变成了O(n),至今印象深刻。Map是由键和值组成的集合,就相当于将key也就是指针存在了栈内存中,通过指针去寻找它的值。并且Map是可迭代的集合,每次迭代后都会返回一个[key,value]的数组。

属性

size 返回集合元素的数量

let map = new Map();
map.set('xiao', 'chen');
map.set('a', 'b');
console.log(map.size); // 2

方法

set(key, value): 往Map中设置新的值

let map = new Map();
map.set('xiao', 'chen');
map.set('a', 'b');
console.log(map);

javascript中Set、Map、WeakSet、WeakMap区别

get(key): 通过key去获取它的值,如果拿不到就返回与undefined

let map = new Map();
map.set('xiao', 'chen');
map.set('a', 'b');
console.log(map.get('a')); // b
console.log(map.get('c')); // undefined

has(key): 判断当前键是否在当前集合中,返回一个布尔值,存在返回true,不存在则返回false

let map = new Map();
map.set('xiao', 'chen');
map.set('a', 'b');
console.log(map.has('a')); // true
console.log(map.has('c')); // false

delete(key): 删除集合中的某个元素,通过key去查找,删除后返回一个布尔值,删除成功返回true,否则返回false

let map = new Map();
map.set('xiao', 'chen');
map.set('a', 'b');
console.log(map.delete('a'));
console.log(map);

javascript中Set、Map、WeakSet、WeakMap区别

5. clear(): 删除集合中的所有元素,没有返回值

let map = new Map();
map.set('xiao', 'chen');
map.set('a', 'b');
console.log(map.clear()); // undefined
console.log(map); // {size: 0}

遍历方法

keys():返回的是一个迭代后的对象,其中包含着Map对象所有的键。

let map = new Map();
map.set('xiao', 'chen');
map.set('a', 'b');
console.log([...map.keys()]); // ['xiao', 'a']

values():返回的是一个迭代后的对象,其中包含Map对象中所有的值。

let map = new Map();
map.set('xiao', 'chen');
map.set('a', 'b');
console.log([...map.values()]); // ['chen', 'b']

entries():返回的是一个迭代后的对象,其中包含Map对象中所有的键值对。

let map = new Map();
map.set('xiao', 'chen');
map.set('a', 'b');
console.log([...map.entries()]);

javascript中Set、Map、WeakSet、WeakMap区别

forEach():遍历Map对象的所有成员

let map = new Map();
map.set('xiao', 'chen');
map.set('a', 'b');

map.forEach((value, key) => {
    console.log(key, value);
});
// xiao chen
// a b

WeakMap

WeakMap和Map一样是键值的集合,但是它的键必须是对象,并且它的键也是弱引用,所有它也有可能被垃圾回收机制所回收且是不可迭代的

以上就是javascript中Set、Map、WeakSet、WeakMap区别的详细内容,更多关于javascript中Set、Map、WeakSet、WeakMap区别的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js 关于=+与+=日期函数使用说明(赋值运算符)
Nov 15 Javascript
浅析JavaScript中的delete运算符
Nov 30 Javascript
JS中表单的使用小结
Jan 11 Javascript
javascript中的undefined和not defined区别示例介绍
Feb 26 Javascript
jquery实现的网页自动播放声音
Apr 30 Javascript
iframe中子父类窗口调用JS的方法及注意事项
Aug 25 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
Aug 26 Javascript
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
Jun 25 Javascript
微信小程序实现展示评分结果功能
Feb 15 Javascript
小程序实现背景音乐播放和暂停
Jun 19 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
Oct 29 Javascript
html5调用摄像头截图功能
Jan 18 Javascript
Vue Element plus使用方法梳理
Dec 24 #Vue.js
前端框架ECharts dataset对数据可视化的高级管理
Dec 24 #Javascript
Vue router配置与使用分析讲解
Dec 24 #Vue.js
React更新渲染原理深入分析
Dec 24 #Javascript
ECharts transform数据转换和dataZoom在项目中使用
Dec 24 #Javascript
uniapp开发打包多端应用完整方法指南
Dec 24 #Javascript
JS前端使用Canvas快速实现手势解锁特效
Sep 23 #Javascript
You might like
基于MySQL分区性能的详细介绍
2013/05/02 PHP
php网站地图生成类示例
2014/01/13 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
2012/10/11 Javascript
jQuery中:not选择器用法实例
2014/12/30 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
JavaScript动态设置div的样式的方法
2015/12/26 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
2016/11/22 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
weebox弹出窗口不居中显示的解决方法
2017/11/27 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
Python中的zip函数使用示例
2015/01/29 Python
Python编程中使用Pillow来处理图像的基础教程
2015/11/20 Python
Python解析树及树的遍历
2016/02/03 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
python采集微信公众号文章
2018/12/20 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
荣耀商城:HIHONOR
2020/11/03 全球购物
大一自我鉴定范文
2013/10/04 职场文书
司马光教学反思
2014/02/01 职场文书
三分钟演讲稿事例
2014/03/03 职场文书
幼儿园庆六一活动方案
2014/03/06 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
python前后端自定义分页器
2022/04/13 Python