ES6 set、WeakSet、 map、WeakMap

141 阅读4分钟

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,表示这个值不再用到,就可以将这块内存释放。