ES6的Set,Map,WeakSet,WeakMap

news/2024/7/19 13:40:21 标签: js

1.set


1.set可以存储引用数据类型


在这里插入图片描述


2.set中的数据都是唯一的(可以用于初始化数组,实现数组的去重)


在这里插入图片描述


3.Set实现了 iterator接口,所以可以使用扩展运算符和for…of…进行遍历,顺序就是插入的顺序


在这里插入图片描述


4.MapSet中对象的引用都是强类型化的,并不会允许垃圾回收。这样一来,如果MapSet中引用了不再需要的大型对象


set的使用

属性
Set 结构的实例有以下属性。

Set.prototype.constructor:构造函数,默认就是Set函数。

Set.prototype.size:返回Set实例的成员总数。


操作方法

Set.prototype.add(value):添加某个值,返回 Set 结构本身。

Set.prototype.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。

Set.prototype.has(value):返回一个布尔值,表示该值是否为Set的成员。

Set.prototype.clear():清除所有成员,没有返回值。


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

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

Set.prototype.entries():返回键值对的遍历器

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

let set = new Set(['red', 'green', 'blue']);for (let item of set.keys()) {
  console.log(item);
}
// red
// green
// bluefor (let item of set.values()) {
  console.log(item);
}
// red
// green
// bluefor (let item of set.entries()) {
  console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]


应用

1.初始化数组()数组的去重

2.并集(Union)、交集(Intersect)和差集(Difference)。

let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}// (a 相对于 b 的)差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}


2.WeakSet


1.和Set结构类似,也是不重复的值的集合,但WeakSet的成员只能是对象

2.WeakSet 中的对象都是弱引用,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。

3.WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失

4.ES6 规定 WeakSet 不可遍历


操作方法

和set但是注意,WeakSet没有size属性因为无法遍历,

WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失,遍历机制无法保证成员的存在,很可能刚刚遍历结束,成员就取不到了


使用场景

1.储存 DOM 节点,而不用担心这些节点从文档移除时,会引发内存泄漏(如果js存储一个dom节点,当该dom节点需要删除时,如果js存储的dom节点没有删除的话就会造成内存泄漏)
在这里插入图片描述


Map


  1. 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者基础类型) 都可以作为一个键或一个值。

  1. 一个Map对象在迭代时会根据对象中元素的插入顺序来进行 — 一个 for...of 循环在每次迭代后会返回一个形式为[key,value]的数组。
    在这里插入图片描述

3.NaN 是与 NaN 相等的(虽然 NaN !== NaN),剩下所有其它的值是根据 === 运算符的结果判断是否相等。


Objects 和 maps 的比较

使用 Map:

储存的键不是字符串/数字/或者 Symbol 时,选择 Map,因为 Object 并不支持

储存大量的数据时,选择 Map,因为它占用的内存更小

需要进行许多新增/删除元素的操作时,选择 Map,因为速度更快

需要保持插入时的顺序的话,选择 Map,因为 Object 会改变排序

需要迭代/遍历的话,选择 Map,因为它默认是可迭代对象,迭代更为便捷

使用 Object:

只是简单的数据结构时,选择 Object,因为它在数据少的时候占用内存更少,且新建时更为高效

需要用到 JSON 进行文件传输时,选择 Object,因为 JSON 不默认支持 Map

需要对多个键值进行运算时,选择 Object,因为句法更为简洁

需要覆盖原型上的键时,选择 Object

虽然 Map 在很多情况下会比 Object 更为高效,不过 Object 永远是 JS
中最基本的引用类型,它的作用也不仅仅是为了储存键值对。

Objects 和 maps 的比较 摘抄:https://zhuanlan.zhihu.com/p/358378689


操作方法

1.size 属性

size属性返回 Map 结构的成员总数。

2.Map.prototype.set(key, value)

set方法设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。
在这里插入图片描述
3.Map.prototype.get(key)

get方法读取key对应的键值,如果找不到key,返回undefined。

4.Map.prototype.has(key)

has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。

5.Map.prototype.delete(key)

delete方法删除某个键,返回true。如果删除失败,返回false。

6.Map.prototype.clear()

clear方法清除所有成员,没有返回值。


遍历
Map.prototype.keys():返回键名的遍历器。

在这里插入图片描述


Map.prototype.values():返回键值的遍历器。

在这里插入图片描述


Map.prototype.entries():返回所有成员的遍历器。

在这里插入图片描述


Map.prototype.forEach():遍历 Map 的所有成员。(可以使用forEach)


Map 转为对象

function strMapToObj(strMap) {
  let obj = Object.create(null);
  for (let [k,v] of strMap) {
    obj[k] = v;
  }
  return obj;
}const myMap = new Map()
  .set('yes', true)
  .set('no', false);
strMapToObj(myMap)
// { yes: true, no: false }

对象转为 Map

使用Object.entries

Object.entries()方法返回一个给定 对象自身 可枚举属性的键值对 数组(把object转化为键值对数组)
在这里插入图片描述


WeakMap

WeakMapMap的区别有两点。

1.WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。

在这里插入图片描述


2.WeakMap的引用时弱引用,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakMap 之中

3.不能遍历,内有size属性,不支持clear()方法


使用场景

1.同WeakSet用来存储DOM节点

2.部署私有属性

利用弱映射,将内部属性设置为实例的弱引用对象,当实例删除时,私有属性也会随之消失,因此不会内存泄漏


参考:https://juejin.cn/post/7062921417196568607#heading-22


http://www.niftyadmin.cn/n/1371466.html

相关文章

ES6的 class类

类声明和函数声明的区别和特点 1、函数声明可以被提升,类声明不能提升(与let声明类似)。 2、类声明中的代码自动强行运行在严格模式下。 3、类中的所有方法都是不可枚举(不可循环)的,而自定义类型中,可以通过Object…

Vue3 script-setup语法糖

vscode中使用script setup 1.起初 Vue3.0 暴露变量必须 return 出来,template 中才能使用; 2.Vue3.2 中 只需要在 script 标签上加上 setup 属性,组件在编译的过程中代码运行的上下文是在 setup() 函数中,无需 return&#xff…

面试题:问js为什么是单线程的

js为什么是单线程的 如果js是多线程的话,一个线程添加DOM一个线程删除DOM那就会产生差错,浏览器不知道应该听谁的,到底删除DOM还是添加DOM。 js是单线程语言,浏览器只分配给js一个主线程,用来执行任务(函…

fetch的各种api

1.结构: fetch(url,{参数)}).then(...).catch(...)2.与async await一起使用 async function fetchMovies() {const response await fetch(/movies);// 等待直到请求完成console.log(response); }3.请求 JSON 数据 fetch()请求成功以后,得…

fetch常用api,fetch和axios的区别

axios 1.从浏览器中创建 XMLHttpRequest 2.客户端支持防止CSRF 3.提供了一些并发请求的接口(重要,方便了很多的操作) 4.从 node.js 创建 http 请求 5.拦截请求和响应 6.转换请求和响应数据 7.自动转换JSON数据 fetch优势 1.语法简洁…

网络优化,css优化, js优化

网络优化 减少HTTP请求,合并文件、精灵图减少DNS查询,使用缓存 当使用了CDN时,DNS 服务器根据用户 IP 地址,将域名解析成相应节点的缓存服务器IP地址,实现用户就近访问。使用 CDN 服务的网站,只需将其域名…

web常见的攻击方式

xss攻击 用户通过浏览器访问web网页,xss攻击通过各种办法在用户访问页面的时候,插入一些自己的代码或者脚本,让用户访问页面的时候,就可以执行这个脚本,攻击者通过插入的脚本的执行就会获得一些信息(比如c…

单例模式,策略模式,代理模式,迭代器模式,发布订阅模式

单例模式 1.什么是单例模式 是指在一个类只能有一个实例,即使多次实例化该类,也只返回第一次实例化后的实例对象。 2.主要解决: 一个全局使用的类频繁地创建与销毁。 3.js单例模式何时使用: 当您想控制实例数目,…