Set
- Set是数据结构中的一种叫集合的数据结构,最大特点是
数据不能重复,无序的,不能通过下标值进行修改 - Set的存储的
数据类型可以是任意的 - Set的引用是
强引用
Set实例对象的属性
- size:返回Set实例的成员总数
const mySet = new Set(['a',1,2,3,1])
console.log(mySet); //{'a',1,2,3}
console.log(mySet.size) // 4
Set实例对象的方法
- add(value):添加某个值,返回Set结构本身(可以链式调用)
- delete(value):删除某个值,删除成功返回true,否则返回false
- has(value):返回一个布尔值,表示该值是否为Set的成员
- clear():清除所有成员,没有返回值
应用场景
- 去重字符串:
[...new Set(str)].join("") - 去重数组:
[...new Set(arr)] - 集合数组
- 声明:
const a = new Set(arr1)、const b = new Set(arr2) - 并集:
new Set([...a,...b]) - 交集:
new Set([...a].filter(v => b.has(v))) - 差集:
new Set([...a].filter(v => !b.has(v)))注意:用set求差集的时候,是第一个数组与第二个数组作比较。输出的结果是第一个数组有的,(而第二个数组没有)的值
- 声明:
let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])
let difference = new Set([...a].filter(x => !b.has(x))) // 1
WeakSet
- 存储的数据只能是
对象类型 - 存储的数据
不能被遍历出来 - 引用为
弱引用
属性
- constructor:构造函数,返回WeakSet
方法
- add():添加值,返回实例
- delete():删除值,返回布尔
- has():检查值,返回布尔
语法
WeakSet是一个构造函数,可以使用new命令创建WeakSet数据结构 作为构造函数,WeakSet可以接受一个数组或类似数组的对象作为参数
// 实例:数组
const arr = [[1,2],[3,4]];
const ws = new WeakSet(arr)
使用场景
JS垃圾回收是一种内存管理技术。不再被引用的对象会被自动删除,而与其相关的资源也会被一同回收。
WeakSet适合临时存在一组对象和跟对象绑定的信息。
用于存储DOM节点,不用担心这些节点从文档移除时会引发内存泄露。
Map
- Map对象保存键值对。任何值(对象或原始值)都可以作为一个键或一个值。构造函数Map可以接受一个数组作为参数
基本用法
const m = new Map()
const o = {p:'hello'}
m.set(o,'content')
console.log(m); // map {{p:'hello'} => 'content'}
// 接受一个数组作为参数
const map = new Map([['name','张三'],['age',12]])
console.log(map.has('name')) // true
console.log(map.get('name')) // 张三
方法
- get(): 返回键值对
- set():添加键值对,返回实例
- delete():删除键值对,返回布尔
- has():检查键值对,返回布尔
- clear():清除所有成员
WeakMap
方法
- get():返回键值对
- set():添加键值对,返回实例
- delete():删除键值对,返回布尔
- has():检查键值对,返回布尔
额外补充----垃圾回收机制
背景
当创建类型、对象、函数等等时,这些是需要内存,对于持续运行的服务进程,必须及时释放内存,否则,内存占用越高,性能越差。当不再需要时,JS引擎就会产生垃圾回收机制
定义
JS的垃圾回收机制就是为了以防内存泄露。内存泄露的含义不再用到的内存,没有及时释放。垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。
内存泄露的识别方法
- 浏览器 F12---》勾选Memory-->点击左上角的录制按钮-->页面进行各种操作,模拟用户使用情况---》一段时间,点击stop按钮,面板会显示这段时间的内存占用情况。 如果内存占用基本平稳,就不存在内存泄露,反之,存在
- 命令行(使用Node提供的process.memoryUsage方法)
什么情况会引起内存泄露
- 全局变量
- 闭包
- 引用DOM元素没有清理
- 被遗忘的定时器或回调
- 子元素存在引用引起的内存泄露
变量的生命周期
- 局部变量:函数执行完就结束了
- 全部变量:浏览器关闭时才结束
JS垃圾回收方式
-
标记清除 当变量进入执行环境时(函数中声明变量),垃圾回收器将其标记为“进入环境”,当变量离开环境时(函数执行结束),标记为“离开环境”。
-
引用计数 通过一张“引用表”,保存了内存里所有的资源的引用次数,如果一个值得引用次数为0,表示这个值不再用到,就可以将这块内存释放。