Set与WeakSet
Set与WeakSet
Set对象允许存储任何类型的唯一值,无论是原始值或者是对象引用,Set对象中的值不会重复。
WeakSet对象允许存储对象弱引用的唯一值,WeakSet对象中的值同样不会重复,且只能保存对象的弱引用。
Set
描述
Set对象是值的集合,可以按照插入的顺序迭代它的元素,Set中的元素只会出现一次,即Set中的元素是唯一的,常用来作数组去重。
属性与方法
Set.prototype.constructor: 返回构造函数。Set.prototype.size: 返回Set对象的值的个数。Set.prototype.add(value): 在Set对象尾部添加一个元素,返回该Set对象。Set.prototype.clear(): 移除Set对象内的所有元素。Set.prototype.delete(value): 移除Set的中与这个值相等的元素。Set.prototype.entries(): 返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值的[value, value]数组,为了使这个方法和Map对象保持相似, 每个值的键和值相等。Set.prototype.forEach(callbackFn[, thisArg]): 按照插入顺序,为Set对象中的每一个值调用一次callback,如果提供了thisArg参数,回调中的this会是这个参数。Set.prototype.has(value): 返回一个布尔值,表示该值在Set中存在与否。Set.prototype.keys(): 返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值。Set.prototype.values(): 返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值。Set.prototype[@@iterator](): 返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值。
示例
var s = new Set([3, 3, 3, 2, 2, 1]);
console.log(s); // Set(3) {3, 2, 1}
s.add(3);
console.log(s); // Set(3) {3, 2, 1}
var setIterator = s[Symbol.iterator]();
console.log(setIterator); // SetIterator {3, 2, 1}
var arr = [3, 3, 3, 2, 2, 1];
arr = [...new Set(arr).keys()]; // 去重
console.log(arr); // (3) [3, 2, 1]
WeakSet
描述
WeakSet的值只能是Object类型,持有的是Object弱引用,原始数据类型不能作为值。WeakSet持有的是对象的弱引用,这意味着在没有其他引用存在时垃圾回收能正确进行,WeakSet用于存储的对象引用只有在其没有被回收时才是有效的,正由于弱引用,WeakSet是不可枚举的。
简单来说,有时需要在某个数组上面存放一些对象,但是这会形成对于这个对象的引用,一旦不再需要这个对象,我们就必须手动删除这个引用,否则垃圾回收机制无法释放对象占用的内存,WeakSet的设计就是解决这个问题的,其所引用的对象都是弱引用,垃圾回收机制不将该引用考虑在内,因此,只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存,此时WeakSet里边所对应的对象引用会消失,不需要手动删除引用。如果需要在数组上添加对象而又不想干扰垃圾回收机制的话,就可以使用WeakSet,此外WeakSet非常适合于对象引用的跟踪,尤其是在涉及大量对象时。
属性与方法
WeakSet.prototype.constructor: 返回构造函数。WeakSet.prototype.add(value): 在该WeakSet对象中添加一个新元素value。WeakSet.prototype.delete(value): 从该WeakSet对象中删除value这个元素。WeakSet.prototype.has(value): 返回一个布尔值, 表示给定的值value是否存在于这个WeakSet中.
内存回收实例
// WeakSet示例代码
var ws = new WeakSet();
var value = new Array(6 * 1024 * 1024); // 开辟一个大数组
ws.add(value);
console.log(ws.has(value)); // true
value = null; // 解除引用
console.log(ws.has(value)); // false
// WeakSet内存回收实例
/** node --expose-gc **/ // 启动node环境 手动调用垃圾回收机制
global.gc(); // 首先调用一次垃圾回收
process.memoryUsage(); // 查看内存占用 heapUsed约2M
/*
{
rss: 20918272,
heapTotal: 4608000,
heapUsed: 2454576,
external: 1384318
}
*/
var ws = new WeakSet();
var value = new Array(6 * 1024 * 1024); // 开辟一个大数组
ws.add(value);
console.log(ws.has(value)); // true
process.memoryUsage(); // heapUsed约53M
/*
{
rss: 74158080,
heapTotal: 55259136,
heapUsed: 53717760,
external: 1384490
}
*/
global.gc(); // 手动执行一次垃圾回收
process.memoryUsage(); // heapUsed约53M
/*
{
rss: 73695232,
heapTotal: 55259136,
heapUsed: 53345008,
external: 1384414
}
*/
value = null; // 解除引用
global.gc(); // 执行垃圾回收
process.memoryUsage(); // heapUsed约2M 内存已回收
/*
{
rss: 23035904,
heapTotal: 5185536,
heapUsed: 2716856,
external: 1384417
}
*/
console.log(ws.has(value)); // false
// Set示例代码 对比
var s = new Set();
var value = new Array(6 * 1024 * 1024); // 开辟一个大数组
s.add(value);
console.log(s.has(value)); // true
value = null; // 解除引用
console.log(s.has(value)); // false
console.log(s); // Set(1) {Array(6291456)}
s.clear(); // 回收内存
console.log(s); // Set(0) {}
// Set内存回收实例 对比
/** node --expose-gc **/ // 启动node环境 手动调用垃圾回收机制
global.gc(); // 首先调用一次垃圾回收
process.memoryUsage(); // 查看内存占用 heapUsed约2M
/*
{
rss: 22994944,
heapTotal: 5185536,
heapUsed: 2695768,
external: 1384350
}
*/
var s = new Set();
var value = new Array(6 * 1024 * 1024); // 开辟一个大数组
s.add(value);
console.log(s.has(value)); // true
process.memoryUsage(); // heapUsed约53M
/*
{
rss: 73793536,
heapTotal: 55521280,
heapUsed: 53478848,
external: 1384507
}
*/
global.gc(); // 手动执行一次垃圾回收
process.memoryUsage(); // heapUsed约53M
/*
{
rss: 73367552,
heapTotal: 55521280,
heapUsed: 53068448,
external: 1384350
}
*/
value = null; // 解除引用
global.gc(); // 执行垃圾回收
process.memoryUsage(); // heapUsed约53M 内存未回收
/*
{
rss: 73437184,
heapTotal: 55521280,
heapUsed: 53091072,
external: 1384384
}
*/
console.log(s.has(value)); // false // 此处为false,这是因为value值的改变,而在这个Set实例对象中依然存在对 Array 的强引用,内存未回收
console.log(s); // Set(1) {Array(6291456)}
s.clear(); // 回收内存
global.gc(); // 执行垃圾回收
process.memoryUsage(); // heapUsed约2M 内存已回收
/*
{
rss: 23142400,
heapTotal: 5185536,
heapUsed: 2769320,
external: 1384441
}
*/
console.log(s); // Set(0) {}
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://www.cnblogs.com/pengaijin/p/7659672.html
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WeakSet
Set与WeakSet的更多相关文章
- ES6 Set/WeakSet
ES6里加入了一个新数据解构Set,和Java的Set一样,它里面不存放重复的元素.Set实现为一个类,使用时需要先new. var s1 = new Set() s1.add(1) s1.add(2 ...
- ES6 WeakSet数据结构 与Set十分相似
它与Set十分相似,对象的值也不能是重复的,与Set不同点: .WeakSet成员只能够是对象. .作为WeakSet成员的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说, ...
- ES6新特性:Javascript中Set和WeakSet类型的数据结构
ES6提供了新的数据结构Set,Set对象不是数组, 可以用来保存对象或者基本类型, 所有保存的值都是唯一的, chrome浏览器>38和FF>13,以及nodeJS,对Set支持良好, ...
- SE6新特性之集合Set、Map、WeakSet和WeakMap详解
SE5的时候我们经常用数组或者类数组对象来操作数据,而对于一些使用惯了java之类语言的集合的开发人员来说,总有少了点什么的感觉,SE6提供Set和Map这两个集合.不仅从根本上为一些问题提供了解决方 ...
- es6学习笔记--新数据结构Set,Map以及WeakSet,WeakMap
在javascript中,存储数据的方式大部分就是以数组或者对象形式存储的,es6出现了4种新集合Set,Map,WeakSet,WeakMap来存储数据,简化了编程. 集合--Set 类似于数组,但 ...
- map,set和weakmap,weakset
概述 set和map属于es6的内容,今天在看书的时候遇到了,所以好好的总结一下,供以后开发时参考,相信对其他人也有用. 参考资料: mdn Keyed collections Map和WeakMap ...
- es6 Map,Set 和 WeakMap,WeakSet
这些是新加的集合类型,提供了更加方便的获取属性值的方法,不用像以前一样用hasOwnProperty来检查某个属性是属于原型链上的呢还是当前对象的.同时,在进行属性值添加与获取时有专门的get,set ...
- 前端forEach在Array、map、set中的使用,weakset,weakmap
数组: var s = ['a','b','c']; s.forEach(function(ele,index,array){ console.log(ele); }); Map: var map = ...
- Set和WeakSet数据结构
学习Set数据结构,注意这里不是数据类型,而是数据结构.它是ES6中新的东西,并且很有用处.Set的数据结构是以数组的形式构建的. Set的声明 let setArr = new Set(['js', ...
- ES6 WeakMap和WeakSet的使用场景
JavaScript垃圾回收是一种内存管理技术.在这种技术中,不再被引用的对象会被自动删除,而与其相关的资源也会被一同回收. Map和Set中对象的引用都是强类型化的,并不会允许垃圾回收.这样一来,如 ...
随机推荐
- 使用Java分析器优化代码性能,解决OOM问题
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 背景 最近我一直在做性能优化,对一个单机应用做性能优化.主要是 ...
- [转帖]Redis重大版本整理(Redis2.6-Redis7.0)
Redis借鉴了Linux操做系统对于版本号的命名规则:node 版本号第二位若是是奇数,则为非稳定版本(例如2.7.2.9.3.1),若是是偶数,则为稳定版本(例如2.6.2.8.3.0.3.2). ...
- 一个监控数据的思考-sockets_used
一个监控数据的思考-sockets_used 背景 最近跟踪一个项目问题. Grafana的监控了里面有一个tcp的使用监控 CurrEstab 的数据量是: 700-2000 左右 但是同时有一个非 ...
- [转帖]Shell脚本数组(实现冒泡排序,直接选择排序,反转排序)
目录 数组 数组定义方法 数组包括的数据类型 获取数组长度 读取某下标赋值 数组遍历 数组切片 数组替换 删除数组 追加数组中的元素 从函数返回数组 加法传参运算 乘法传参运算 数组排序算法 冒泡排序 ...
- 【转帖】SQUID TIME_WAIT值过高引起的服务器被拖慢
https://www.diewufeiyang.com/post/895.html 查看TCP的连接状态值: # netstat -n | awk '/^tcp/ {++S[$NF]} END {f ...
- [转帖]1.IPtable基础命令总结
https://www.cnblogs.com/kcxg/p/10350870.html 规则查询 #查看对应表中的所有规则 iptables -t 表名 -L #查看表的指定链中的规则 iptabl ...
- [转帖]淫技巧 | 如何查看已连接的wifi密码
https://blog.csdn.net/DynmicResource/article/details/120134984?spm=1001.2014.3001.5502 主题使用方法:https: ...
- TCP内核参数的简单验证
前言 春节假期时学习了下内核参数与nginx的调优 最近因为同事遇到问题一直没有解,自己利用晚上时间再次进行验证. 这里将几个参数的理解和验证结果简单总结一下. 希望能够在学习的过程中将问题解决掉. ...
- Nginx 解决 413 问题的配置.
Nginx 解决 413 问题的配置. Nginx 容易出现一个错误提示问题: worker_processes 1; events { worker_connections 1024; } http ...
- vue中sync的使用原来这么简单
sync的使用场景 有些时候子组件需要修改父组件传递过来的prop, 要去改变父组件的状态的时候就需要使用aync 看见这里有些同学可能会问?? 不是说不可以修改父组件传递到子组件的值吗? 为啥要修改 ...