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 相关文章推荐
javascript模拟的Ping效果代码 (Web Ping)
Mar 13 Javascript
JS将制定内容复制到剪切板示例代码
Feb 11 Javascript
JS阻止用户多次提交示例代码
Mar 26 Javascript
js获取元素外链样式的方法
Jan 27 Javascript
jQuery获得子元素个数的方法
Apr 14 Javascript
JQ实现新浪游戏首页幻灯片
Jul 29 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
May 28 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
Jul 04 Javascript
JS+Canvas绘制动态时钟效果
Nov 10 Javascript
vue项目使用微信公众号支付总结及遇到的坑
Oct 23 Javascript
Vue将页面导出为图片或者PDF
Aug 17 Javascript
Vue.js watch监视属性知识点总结
Nov 11 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
使用php实现从身份证中提取生日
2016/05/09 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
JS中window.open全屏命令解析及使用示例
2013/12/11 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
jquery实现简单文字提示效果
2015/12/02 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
2018/11/14 Javascript
vscode下的vue文件格式化问题
2018/11/28 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
2019/01/16 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
乌克兰在线药房:Аптека24
2019/10/30 全球购物
计算s=f(f(-1.4))的值
2014/05/06 面试题
运动会广播稿500字
2014/01/28 职场文书
医院检讨书范文
2014/02/01 职场文书
个人综合鉴定材料
2014/05/23 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
住房租房协议书
2014/08/20 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
工伤私了协议书范本
2014/11/24 职场文书
建国大业电影观后感
2015/06/01 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书
Mysql基础知识点汇总
2021/05/26 MySQL
Python作用域和名称空间的详细介绍
2022/04/13 Python