当前位置: 首页 > news >正文

ES6语法详解,面试必会,通俗易懂版

目录

    • Set的基本使用
    • WeakSet 使用
      • Set 和 WeakSet 区别
        • 内存泄漏示例:使用普通 Set 保存 DOM 节点
        • 如何避免这个内存泄漏
        • Map
        • WeakMap 的使用

Set的基本使用

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

const set = new Set([1, 2, 3, 4, 4]);
console.log(set) // Set(4) {1, 2, 3, 4}const set2 = new Set()
const arr = [2,3,4,5,5,5,8,8]
arr.forEach((item)=>{set2.add(item)
})
for(let item of set2) {console.log(item) // 2 3 4 5 8 
}const set3 = new Set([2,32,3,23,23,23,2,32,3,23])
for(let item of set3) {console.log(item) //2 32 3 23
}
const NewArr = [...set3]
const NewArr2 = Array.from(set3) 
console.log(NewArr) //[ 2, 32, 3, 23 ]
console.log(NewArr2) //[ 2, 32, 3, 23 ]

set 属性
在这里插入图片描述
Code

const set4 = new Set([2,32,3,23,23,12312])
set4.add(55)
console.log(set4)
console.log(set4.has(55))
set4.delete(55)
console.log(set4.has(55))
const set5 = new Set()
set4.forEach((item)=>{item = item*2set5.add(item)
})
console.log(set4)
console.log(set5)
set4.clear()

WeakSet 使用

和Set类似的另外一个数据结构称之为WeakSet,也是内部元素不能重复的数据结构。
和Set区别
区别一:WeakSet中只能存放对象类型,不能存放基本数据类型
区别二:WeakSet对元素的引用是弱引用,如果没有其他引用对某个对象进行引用,那么GC可以对该对象进行回收

code
在这里插入图片描述
Code

let hd = {name:"houdunren"}
let edu = hd;
// 此时我们引用了俩次该内存地址,引用次数为2
let set6 = new WeakSet();
set6.add(hd)
// 再将该内存地址的数据加入WeakSet类型中,引用次数不会增加,我们将这种方式成为弱引用类型,Set的迭代方法等等都无法使用
console.log(set6.has(hd));
// 如果此时我们将hd和edu清空,那么该内存地址的数据将会被当作垃圾处理
hd = null;
edu = null;
// 而此时WeakSet中还是会认为有数据
console.log(set6.has(hd));

Set 和 WeakSet 区别

非常详细,好好读
Set 以及 WeakSet 区别以及用法

在 JavaScript 中,使用 WeakSet 来保存 DOM 节点确实可以减少内存泄漏的风险,因为 WeakSet 存储的是对象的弱引用,当对象没有被其他地方引用时,可以被垃圾回收。然而,如果错误地使用普通 Set 来保存 DOM 节点,就可能造成内存泄漏。以下是一个例子:

内存泄漏示例:使用普通 Set 保存 DOM 节点
<div id="container"><!-- 动态创建的按钮将被添加到此容器中 -->
</div>
<button id="addBtn">添加按钮</button>
<script>// 获取容器和添加按钮的 DOM 元素let container = document.getElementById('container');let addBtn = document.getElementById('addBtn');// 创建一个 Set 来保存按钮的引用let buttonsSet = new Set();// 为添加按钮添加点击事件监听器addBtn.addEventListener('click', function() {// 创建一个新的按钮let newBtn = document.createElement('button');newBtn.textContent = '新按钮';// 将新按钮添加到页面和 Set 中container.appendChild(newBtn);buttonsSet.add(newBtn); // 这里使用 Set 保存了对 DOM 元素的强引用// 如果不手动删除这些按钮,它们会一直被 Set 强引用,即使页面上已经没有这些按钮了});
</script>

在这个例子中,每次点击 “添加按钮” 时,都会创建一个新的按钮并将其添加到页面上。
同时,这个新按钮的引用也被添加到了 buttonsSet 这个 Set 对象中。
由于 Set 存储的是强引用,即使这些按钮从 DOM 中移除,
只要它们还在 Set 中,它们就不会被垃圾回收器回收,从而导致内存泄漏。

如何避免这个内存泄漏
  1. 使用 WeakSet 替代 Set:如果使用 WeakSet 来存储按钮的引用,那么当按钮从 DOM 中移除后,没有其他地方引用它们时,它们就可以被垃圾回收。
  2. 手动管理引用:在不再需要按钮时,应该从 Set 中删除对应的引用,并从 DOM 中移除按钮。
  3. 移除事件监听器:在按钮从 DOM 中移除时,也应该移除所有附加的事件监听器。
  4. 使用一次性函数:如果事件监听器只需要执行一次,可以在执行完后立即删除它,避免长期持有 DOM 元素的引用。

以下是使用 WeakSet 避免内存泄漏的修正代码:

// 使用 WeakSet 而不是 Set 来保存按钮的引用
let buttonsWeakSet = new WeakSet();addBtn.addEventListener('click', function() {let newBtn = document.createElement('button');newBtn.textContent = '新按钮';container.appendChild(newBtn);buttonsWeakSet.add(newBtn); // 使用 WeakSet 保存对 DOM 元素的弱引用// 添加按钮移除逻辑,例如: (手动清理, 可以不加 )newBtn.addEventListener('click', function() {container.removeChild(newBtn);buttonsWeakSet.delete(newBtn); // 从 WeakSet 中删除引用});
});

在这个修正后的代码中,使用 WeakSet 来存储按钮的引用,
当按钮不再出现在页面上时,它们可以自动被垃圾回收,
因为 WeakSet 中的引用不会阻止这一过程。

Map

在这里插入图片描述
Map 实例的遍历方法有:
keys():返回键名的遍历器。
values():返回键值的遍历器。
entries():返回所有成员的遍历器。
forEach():遍历 Map 的所有成员

const map = new Map();
map.set('aaa', 100);
map.set('bbb', 200);for (let key of map.keys()) {console.log(key);
}
// "aaa"
// "bbb"for (let value of map.values()) {console.log(value);
}
// 100
// 200for (let item of map.entries()) {console.log(item[0], item[1]);
}
// aaa 100
// bbb 200// 或者
for (let [key, value] of map.entries()) {console.log(key, value);
}
// aaa 100
// bbb 200 
WeakMap 的使用

和Map类型的另外一个数据结构称之为WeakMap,也是以键值对的形式存在的。
在这里插入图片描述

总结
汇总

相关文章:

ES6语法详解,面试必会,通俗易懂版

目录 Set的基本使用WeakSet 使用Set 和 WeakSet 区别内存泄漏示例&#xff1a;使用普通 Set 保存 DOM 节点如何避免这个内存泄漏MapWeakMap 的使用 Set的基本使用 在ES6之前&#xff0c;我们存储数据的结构主要有两种&#xff1a;数组、对象。 在ES6中新增了另外两种数据结构&a…...

CTFshow--Web--代码审计

目录 web301 web302 web303 web304 web305 web306 web307 web308 web309 web310 web301 开始一个登录框, 下意识sql尝试一下 发现 1 的时候会到一个 checklogin.php 的路径下, 但啥也没有 好吧, 这是要审计代码的 ,下载好源码, 开始审计 看了一下源码 , 应该就是sql…...

Java语言程序设计——篇十(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 接口介绍 接口概述接口定义接口的实现实战演练 &#x1f445;接口的继承实战演练实战演练 接口的类型常量实战演练 静态方法默认方法解决默认方…...

Qt对比MFC优势

从Qt小白到现在使用了有四年的时间&#xff0c;之前也搞过MFC,WinForm,基本上都是桌面的框架&#xff0c; 从难易程度看MFC>QT>WinForm; 运行的效率上来看MFC>QT>WinForm; 开发效率上WinForm>QT>MFC; 跨平台Qt首选&#xff1b; 界面的美观难易程度Qt>…...

RuntimeError: No CUDA GPUs are available

RuntimeError: No CUDA GPUs are available 目录 RuntimeError: No CUDA GPUs are available 【常见模块错误】 【解决方案】 解决步骤如下&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科…...

URL参数中携带中文?分享 1 段优质 JS 代码片段!

本内容首发于工粽号&#xff1a;程序员大澈&#xff0c;每日分享一段优质代码片段&#xff0c;欢迎关注和投稿&#xff01; 大家好&#xff0c;我是大澈&#xff01; 本文约 800 字&#xff0c;整篇阅读约需 1 分钟。 今天分享一段优质 JS 代码片段&#xff0c;在发送 ajax 请…...

sass的使用

一、变量 //声明一个变量 $highlight-color: #F90; .selected {border: 1px solid $highlight-color; }//编译后 .selected {border: 1px solid #F90; }二、导入 import "xxx.scss"三、混合器简单定义 通过mixin定义&#xff0c;通过include调用 // mixin.scss /…...

【足球走地软件】走地数据分析预测【大模型篇】走地预测软件实战分享

了解什么是走地数据&#xff1f; 走地数据分析&#xff0c;在足球赛事的上下文中&#xff0c;是一种针对正在进行中的比赛进行实时数据分析的方法。这种方法主要用于预测比赛中的某些结果或趋势&#xff0c;如总进球数、比分变化、球队表现等。 在足球走地数据分析中&#xf…...

现在有什么赛道可以干到退休?

最近&#xff0c;一则“90后无论男女都得65岁以后退休”的消息在多个网络平台流传&#xff0c;也不知道是真是假&#xff0c;好巧不巧今天刷热点的时候又看到一条这样的热点&#xff1a;现在有什么赛道可以干到退休&#xff1f; 点进去看了几条热评&#xff0c;第一条热评说的…...

c程序杂谈系列(职责链模式与if_else)

从处理器的角度来说&#xff0c;条件分支会导致指令流水线的中断&#xff0c;所以控制语句需要严格保存状态&#xff0c;因为处理器是很难直接进行逻辑判断的&#xff0c;有可能它会执行一段时间&#xff0c;发现出错后再返回&#xff0c;也有可能通过延时等手段完成控制流的正…...

前端开发技术之CSS(层叠样式表)

盒模型&#xff08;Box Model&#xff09; CSS盒模型描述了如何计算一个元素的总宽度和高度。 它包括以下几个部分&#xff1a; 1. 内容&#xff08;Content&#xff09;&#xff1a;元素的实际内容&#xff0c;比如文本或图片。 2. 内边距&#xff08;Padding&#xff09;&…...

go语言day20 使用gin框架获取参数 使用自定义的logger记录日志

Golang 操作 Logger、Zap Logger 日志_golang zap-CSDN博客 目录 一、 从控制器中获取参数的几种形式 1&#xff09; 页面请求url直接拼接参数。 2&#xff09; 页面请求提交form表单 3&#xff09; 页面请求发送json数据&#xff0c;使用上下文对象c的BindJSON()方法接…...

DHCP笔记

DHCP---动态主机配置协议 作用&#xff1a;为终端动态提供IP地址&#xff0c;子网掩码&#xff0c;网关&#xff0c;DNS网址等信息 具体流程 报文抓包 在DHCP服务器分配iP地址之间会进行广播发送arp报文&#xff0c;接收IP地址的设备也会发送&#xff0c;防止其他设备已经使用…...

TCP为什么需要四次挥手?

tcp为什么需要四次挥手&#xff1f; 答案有两个&#xff1a; 1.将发送fin包的权限交给被动断开发的应用层去处理&#xff0c;也就是让程序员处理 2.接第一个答案&#xff0c;应用层有了发送fin的权限&#xff0c;可以在发送fin前继续向对端发送消息 为了搞清楚这个问题&…...

MySQL 索引相关基本概念

文章目录 前言一. B Tree 索引1. 概念2. 聚集索引/聚簇索引3. 辅助索引/二级索引4. 回表5. 联合索引/复合索引6. 覆盖索引 二. 哈希索引三. 全文索引 前言 InnoDB存储引擎支持以下几种常见索引&#xff1a;BTree索引&#xff0c;哈希索引&#xff0c;全文索引 一. B Tree 索引…...

Neutralinojs教程项目实战初体验(踩坑指南),干翻 electron

Neutralinojs 项目实战初体验&#xff08;踩坑指南&#xff09;&#xff0c;干翻 electron Neutralinojs 官方文档 卧槽卧槽&#xff0c;&#xff01;这个年轻人居然用浏览器把电脑关机了_哔哩哔哩_bilibili正是在下 本教程搭建的是纯原生项目&#xff0c;没有和其它前端框架…...

【轻松拿捏】Java-List、Set、Map 之间的区别是什么?

List、Set、Map 之间的区别是什么&#xff1f; 一、List 二、Set 三、Map &#x1f388;边走、边悟&#x1f388;迟早会好 一、List 有序性&#xff1a;List 保持元素的插入顺序&#xff0c;即元素按添加的顺序存储和访问。允许重复&#xff1a;List 可以包含重复的元素。…...

用户史订单查询业务

文章目录 概要整体架构流程技术细节小结 概要 在电商、金融、物流等行业中&#xff0c;用户历史订单查询是一项常见的业务需求。这项功能允许用户查看他们过去的交易记录&#xff0c;包括但不限于购买的商品、服务详情、交易金额、支付状态、配送信息等。对于企业而言&#xf…...

第8节课:CSS布局与样式——掌握盒模型与定位的艺术

目录 盒模型&#xff1a;网页布局的基础盒模型的属性盒模型的示例 定位&#xff1a;控制元素位置定位的类型定位的示例 实践&#xff1a;使用CSS布局创建响应式网页结语 CSS布局是网页设计中的基石&#xff0c;它决定了网页元素的排列和分布。盒模型和定位是CSS布局中的两个核心…...

electron 主进程和渲染进程

最近在整理electron 相关的项目问题&#xff0c;对自己来说也是温故知新&#xff0c;也希望能对小伙伴们有所帮助&#xff0c;大家共同努力共同进步。加油&#xff01;&#xff01;&#xff01;&#xff01; 虽然最近一年前端大环境不好&#xff0c;但是大家还是要加油鸭&#…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...