JavaScript高级(十三)---ES6中Set,map

 ES6

Set
  • 在ES6之前,我们存储数据的结构主要有两种:数组、对象。

    • 在ES6中新增了另外两种数据结构:Set、Map,以及它们的另外形式WeakSet、WeakMap。
  • Set是一个新增的数据结构,可以用来保存数据,类似于数组,但是和数组区别元素不能重复

    • 创建Set我们需要通过Set构造函数(暂时没有字面量创建的方式):
  • Set常见的属性和方法

    • size 返回Set中元素的个数。[属性]
    • add(value) 添加某个Set元素,并返回对象本身。
    • delete(key):根据key删除一个键值对,返回Boolean类型。
    • has(value) 判断某个元素是否存在,返回boolean类型。
    • clear() 清空所有元素,没有返回值。
    • forEach() 遍历
  • 使用场景

    • 数组去重

WeakSet
  • 和Set类似的另外一个数据结构称之为WeakSet,也是内部元素不能重复的数据结构。
  • 那么和Set有什么区别呢?
    • 区别一:WeakSet中只能存放对象类型,不能存放基本数据类型;
    • 区别二:WeakSet对元素的引用是弱引用,如果没有其他引用对某个对象进行引用,那么GC可以对该对象进行回收;
    • 无法遍历
  • 常见方法
    • add(value):添加某个元素,返回WeakSet对象本身;
    • delete(value):从WeakSet中删除和这个值相等的元素,返回boolean类型;
    • has(value):判断WeakSet中是否存在某个元素,返回boolean类型;
  • 使用场景
      // Stack Overflowconst pwset = new WeakSet();class Person {// new的时候会执行constructor里面的代码constructor() {pwset.add(this)}running() {if (!pwset.has(this)) {throw new Error('不能通过其他对象来调用running方法')}console.log("running", this)}}var p = new Person();console.log(p.running())// 会报错p.running.call({ })// 这里为什么使用WeakSet呢? // 因为WeakSet是弱引用 我们把p = null 后 就会被GC回收// 如果使用Set 就会是强引用 ,我们把p = null 后 还要 set.delete(p) 才会被GC回收
    强引用和弱引用的区别
  • 弱引用 弱引用与强引用相对, 一个对象若只被弱引用所引用,则被认为是不可访问(或弱可访问)的,并因此可能在任何时刻被回收。因此使用弱引用可以防止内存泄漏。在JavaScript中弱引用的WeakMapWeakSet

强引用 JavaScript中最常见的就是声明一个变量并且将一个引用类型数据(对象)赋值给这个变量,这种情况就是强引用。只要该对象还被引用,垃圾回收机制GC就不会回收该对象或者属性。对于一个普通对象,将全部引用该对象的变量关系相应设置为null,便能等待垃圾回收机制GC回收

map

  • 数据结构Map,用于存储映射关系。

    • 事实上我们对象存储映射关系只能用字符串(ES6新增了Symbol)作为属性名(key);
    • 某些情况下我们可能希望通过其他类型作为key,比如对象,这个时候会自动将对象转成字符串来作为key;对象的key内部会自动toString();
  • Map常见的属性和方法

    • size 返回Set中元素的个数。[属性]
    • set(key, value):在Map中添加key、value,并且返回整个Map对象。
    • get(key):根据key获取Map中的value。
    • has(value) 判断某个元素是否存在,返回boolean类型。
    • clear() 清空所有元素,没有返回值。
    • forEach(value,key,map) 遍历
  • 使用场景

    • 缓存
    •     const decorator = (fn) => {const mapList = new Map();return (x, y) => {const sum = `${x}${y}`;if (mapList.has(sum)) {return mapList.get(sum);}const res = fn(x, y)mapList.set(sum, res);return res;}}let work = (a, b) => {return a + b;}work = decorator(work)work(1, 2);work(1, 2); // 这里实际上用的缓存work(3, 4);work(3, 4); // 这里实际上用的缓存
      
      WeakMap
    • WeakMap的key只能使用对象,不接受其他的类型作为key

    • WeakMap的key对对象想的引用是弱引用,如果没有其他引用引用这个对象,那么GC可以回收该对象;

    • WeakMap常见方法:

      • set(key, value):在Map中添加key、value,并且返回整个Map对象
      • get(key):根据key获取Map中的value
      • has(key):判断是否包括某一个key,返回Boolean类型
      • delete(key):根据key删除一个键值对,返回Boolean类型
    • Weak使用场景(vue3响应式原理)

  •     const obj1 = {name: "why",age: 18}const obj2 = {name: "why",age: 18}// 1.创建WeakMapconst weakMap = new WeakMap();// 2. 收集依赖结构// 2.1 使用map来收集const obj1Map = new Map();obj1Map.set("name", [obj1GetName, obj1SetName])obj1Map.set("age", [obj1GetAge, obj1SetAge])weakMap.set(obj1, obj1Map)// 3.如果obj1.name发生改变// Proxy/Object.definePropertyobj1.name = "test";const targetMap = weakMap.get(obj1);const fns = targetMap.get("name")fns.forEach(item => item())function obj1GetName() {console.log("obj1GetName")}function obj1SetName() {console.log("obj1SetName")}function obj1GetAge() {console.log("obj1GetAge")}function obj1SetAge() {console.log("obj1SetAge")}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/762613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应用APM-如何配置Prometheus + Grafana监控springboot应用

文章目录 概述在Spring Boot应用中集成Micrometerspringboot配置修改 Docker安装Prometheus和Grafanaprometheus配置grafana配置启动Prometheus和Grafana在Grafana中配置数据源创建Grafana仪表盘配置Grafana告警(可选)监控和分析 概述 配置Prometheus和…

前缀列表和route-policy

前缀列表和route-policy ACL:访问控制列表 1、它可以用于过滤流量报文 2、又可以过滤路由条目 前缀列表: 1、只能过滤路由条目 2、不能过滤流量报文 ACL:在过滤路由条目时,只能过滤路由前缀。 前缀列表:在过滤…

第十节HarmonyOS 常用容器组件2-Counter

1、描述 计数器组件,提供相应的增加或者减少的计数操作。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 2、子组件 可以包含子组件。 3、接口 Counter() 从API version 9开始…

如何在Android设备上运行深度网络

返回:OpenCV系列文章目录(持续更新中......) 上一篇: 下一篇: 介绍 在本教程中,您将了解如何使用 OpenCV 深度学习模块在 Android 设备上运行深度学习网络。教程是为 Android Studio 2022.2.1 编写的。…

SystemService.java 解读

frameworks/base/services/core/java/com/android/server/SystemService.java 是Android框架服务层的一个核心Java类文件,它在Android系统中扮演着基础服务管理的重要角色。 SystemService类通常作为系统服务的基类,定义了系统服务的基本结构和生命周期…

牛客小白月赛86(D剪纸游戏)

题目链接:D-剪纸游戏_牛客小白月赛86 (nowcoder.com) 题目描述: 输入描述: 输入第一行包含两个空格分隔的整数分别代表 n 和 m。 接下来输入 n行,每行包含 m 个字符,代表残缺纸张。 保证: 1≤n,m≤10001 字符仅有 . 和 * 两种字符&#xf…

基于ssm的实验室耗材管理系统设计与实现论文

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对实验室耗材信息管理混乱,出错率高,信息安全性…

linux 外部GPIO Watchdog驱动适配

前言 文章描述, 利用外部gpio看门狗芯片驱动芯片的复位功能。 芯片:RK3568 平台: Linux ubuntu.lan 4.19.232 #27 SMP Sat Sep 23 13:43:49 CST 2023 aarch64 aarch64 aarch64 GNU/Linux 硬件接线图示 看门狗芯片采用GPIO喂狗,W…

蓝桥杯(3.21 刷真题)

P8682 [蓝桥杯 2019 省 B] 等差数列 import java.util.Arrays; import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int[] res new int[n1];for(int i1;i<n;i)res[i] sc.ne…

LeetCode540 有序数组中的单一元素

Leetcod540 有序数组中的单一元素 1.题目描述 2.解题思路 同样是二分搜索&#xff0c;利用当i为偶数时候&#xff0c;数组中单独元素左侧的所有i位置与i1位置的数字相同&#xff0c;而单独元素右侧的所有i位置与i1位置元素不同的特性&#xff0c;来进行二分搜索 3.算法思路 …

hexo怎么修改默认主题?

npm install 主题 修改_config.yml文件的theme 复制一份_config.yml 改名为_config.主题.yml hexo clean hexo g hexo s就这么简单 选主题 https://hexo.io/themes/ 比如 fluid npm install --save hexo-theme-fluid修改主题 配置新主题 执行新主题 hexo clean hexo g hexo…

K8s-网络原理-中篇

引言 本文是《深入剖析 K8s》的学习笔记&#xff0c;相关图片和案例可从https://github.com/WeiXiao-Hyy/k8s_example中获取&#xff0c;欢迎 ⭐️! 上篇主要介绍了 Flannel 插件为例&#xff0c;讲解了 K8s 里容器网络和 CNI 插件的主要工作原理。还有一种“纯三层”的网络方…

Android项目集成Flutter模块

官方文档将 Flutter module 集成到 Android 项目 按照官方文档添加Flutter模块后遇到了问题&#xff1a;Failed to apply plugin class ‘FlutterPlugin‘. 最后参考这篇文章解决了

Linux下的parted磁盘分区工具

简介 Linux下的parted分区工具是一款功能强大的磁盘分区和分区大小调整工具&#xff0c;由GNU组织开发。它支持多种分区表格式&#xff0c;包括MS-DOS&#xff08;MBR&#xff09;和GPT&#xff0c;尤其适用于规则大小超过2TB的分区&#xff0c;但也可用于小分区的规划。GPT格…

vivado 增量实施

增量实施 增量实现是指增量编译的实现阶段设计流程&#xff1a; •通过重用参考设计中的先前布局和布线&#xff0c;保持QoR的可预测性。 •加快地点和路线的编制时间或尝试最后一英里的计时关闭。 下图提供了增量实现设计流程图。该图还说明了增量合成流程。有关增量的更多…

JDK8-AudioClip无法播放音乐

异常现象 在 JDK 8 中&#xff0c;AudioClip 类用于播放音频片段。然而&#xff0c;有时候你可能发现需要在调用 AudioClip 的播放方法后线程休眠一段时间&#xff0c;音频才能正常播放。 基础概念 AudioClip接口&#xff0c;它的实现类是JavaSoundAudioClip&#xff0c;位…

P8786 [蓝桥杯 2022 省 B] 李白打酒加强版

我的代码&#xff1a; #include <iostream> using namespace std;int dp[101][101][101]; const int mod 1e9 7; //题中说了&#xff0c;答案要取模 int main() {int n, m; //定义遇到店n次&#xff0c;遇花m次cin >> n >> m;dp[0][0][2] 1; //因为题目…

C语言内存函数之 memcmp函数

memcmp函数的记忆&#xff1a;mem表示内存&#xff0c;单位是字节&#xff0c;表示以单位字节来进行操作&#xff1b;头文件是string.h&#xff0c;cmp是compare的缩写&#xff0c;表示比较。总的意思就是在规定的内存下以字节为单位一个字节一个字节的进行比较。 memcmp函数的…

Redis 的5种数据类型的基本命令

目录 String的基本命令 1. SET 2. GET 3. GETSET 4. STRLEN 5. APPEND 6. SETRANGE 7. GETRANGE 8. SETEX 9. SETNX 10. MSET 11. MGET 12. INCR 13. DECR 14. INCRBY 15. DECRBY 16. INCRBYFLOAT Map的基本命令 1. HSET 2. HGET 3. HMSET 4. HMGET 5. …

MySQL之索引与事务

一 索引的概念 一种帮助系统查找信息的数据 数据库索引 是一个排序的列表&#xff0c;存储着索引值和这个值所对应的物理地址无须对整个表进行扫描&#xff0c;通过物理地 址就可以找到所需数据是表中一列或者若干列值排序的方法 需要额外的磁盘空间 索引的作用 1 数据库…