【H2O2|全栈】JS进阶知识(六)ES6(2)
目录
前言
开篇语
准备工作
Set和Map
基本概念
Set
相互转化
常见属性和API
数组去重
并集、交集和差集
Map
转化
常见的属性和API
Set和Map的区别
This的指向
function函数
箭头函数
修改this
使用方式
三种方式的异同
案例
更改this指向为obj
求数组数据最大值
闭包
概念
形式
优缺点
案例
事件绑定
稍微复杂一些的情况
结束语
前言
开篇语
本系列博客主要分享JavaScript的进阶语法知识,本期为第六期,依然围绕ES6的语法进行展开。
本期内容为:Set,Map,This指向和闭包。
与基础部分的语法相比,ES6的语法进行了一些更加严谨的约束和优化,因此,在之后使用原生JS时,我们应该尽量使用ES6的语法进行代码编写。
准备工作
软件:【参考版本】Visual Studio Code
插件(扩展包):Open in browser, Live Preview, Live Server, Tencent Cloud AI Code Assistant, htmltagwrap
提示:在不熟练的阶段建议关闭AI助手
浏览器版本:Chrome
系统版本: Win10/11/其他非Windows版本
Set和Map
基本概念
Set和Map是ES6新增的两种数据类型,它们本质上都是构造函数,使用new进行实例化。
Set中的数据项为单项,且可以实现自动去重。
Map中的数据项为键值对,可以利用键进行增删改查。
Set
相互转化
Set的构造器可以接收一个数组,即将数组转化成Set类型数据。
基本形式如下——
let set = new Set(arr);
在这个过程中,数组arr中的重复数据将被自动去除。
与之对应的,Set可以使用扩展运算符展开,并存入数组中。
基本形式如下——
let arr = [...set];
常见属性和API
属性/API | 作用 |
---|---|
size | 获取Set的大小 |
add() | 增加数据,可以链式操作 |
delete() | 删除数据,不可链式操作 |
clear() | 清空Set |
has() | 查询是否含有某个元素,返回true/false 只可以查单层,如果有多层数组转成的Set集合,则查询第一层 |
数组去重
在数组==>Set==>数组的过程中,可以实现数组的去重操作。
于是,可以得到数组去重的最简单的方式——
arr = [...new Set(arr)];
并集、交集和差集
利用Set集合和数组的API结合,可以求两个数组之间的集合关系。
比如有下面这两个数组——
let arr1 = [1, 2, 5, 8]
let arr2 = [2, 5, 9, 11]
现在要求它们的并集,可以先将两个数组拼接起来,然后转成Set集合去重,最后转回数组。
let arr3 = [...new Set([...arr1, ...arr2])]
如果需要求它们的交集,可以现将其中的一个数组转为Set集合,利用另一数组的filter方法过滤出包含对方的数据。
let arr4 = arr1.filter(item => new Set(arr2).has(item))
如果需要求它们的差集,则只需要从并集中过滤出不是交集的部分即可。
let arr5 = arr3.filter(item => !arr4.has(item))
Map
转化
Map中存储的是键值对数据,所以它的构造器需要接受一个二维数组,每个元素的第一位是键,第二位是值,类似下面的形式——
var arr = [["key1", "value1"], ["key2", "value2"], ["key3", "value3"]]
let map = new Map(arr)
常见的属性和API
属性/API | 作用 |
---|---|
size | 获取Map的大小 |
set(key, value) | 没有key,则设置key => value对 有key,则修改key对应的value |
delete() | 删除指定键值对 |
clear() | 清空Map() |
get() | 查询某个键对应的值 |
Set和Map的区别
①应用场景:Set用于数据重组,Map用于数据储存;
②Set:
(1)成员不能重复
(2)只有键值没有键名,类似数组
(3)可以遍历,方法有add, delete, has, clear
Map:
(1)本质上是健值对的集合,类似集合
(2)可以遍历,可以跟各种数据格式转换,方法有add, delete, set, has, clear
This的指向
function函数
命名函数,this指向window。
function fn() {console.log(this);//window}
匿名函数,this指向window。
let a = function () {console.log(this);//window};
立即调用函数,this指向window。
(function () {console.log(this);//window})();
事件函数,this指向事件源。
document.querySelector("#btn").onclick = function () {console.log(this);//事件源(btn)}
构造函数,this指向实例化对象。
function Per(name, age, sex) {this.name = namethis.age = agethis.sex = sexthis.fn = function () {console.log(this);//实例化对象}}
对象中的函数,this指向调用者。
let obj = {fn: function() {console.log(this);//obj}}
箭头函数
箭头函数没有this指向,在箭头函数中的this指向为父级的this指向。
let obj = {fn: () => {console.log(this);//window}}
修改this
使用方式
目前,有三种修改this指向的方式——call(),apply(),bind()。
call()的使用方式如下——
方法名.call(修改后的指向,参数1,参数2,……)
call的参数为枚举类型。
apply()的使用方式如下——
方法名.apply(修改后的指向,[参数1,参数2,……])
apply的参数为数组类型。
bind()的使用方式如下——
方法名.bind(修改后的指向,参数1,参数2,……)
bind()的参数也是枚举类型。
三种方式的异同
三个的相同点:都用于修改this指向;
不同点:
1.调用方式不同:call和apply都是默认立即调用,bind返回函数体,需要手动调用(可以使用立即调用函数);
2.传参方式不同:call和bind都是枚举形式传参,apply为数组形式传参。
案例
更改this指向为obj
对于下面这段代码——
var x = 1, y = 2var obj = {x: 3,y: 4}function fun() {console.log(this.x, this.y);}
上面的代码中,this的指向默认为window,所以这里输出的是window中的x和y的值。
如果想要输出obj中的x和y,可以使用下面的方式(示例)更改this指向——
fun.call(obj)
求数组数据最大值
Math对象的max()方法可以用来求输入参数中的最大值,如果我们想要让传入的参数为一个数组,则需要使用到apply()方法。
这里我们不需要改变this指向,依然设置原来的指向Math.max。
let maxNum = Math.max.apply(Math.max, [1, 2, 3])
闭包
概念
js方法的作用域是静态的,是定义函数的作用域,不是执行的作用域。
调用外部函数返回的内部函数后,即使外部函数已经执行完毕,被内部函数引用的外部函数的变量依然会保存在内存中,这些引用了其他函数作用域变量的函数(或变量)以及这些被引用变量的集合,就是闭包。
形式
闭包的一种示例形式如下,b就是一种闭包(保存了方法内部变量a的值)。
function fn() {// 函数作用域let a = 7return a}// 执行作用域let b = fn()
优缺点
优点:读取函数内部变量,使这些变量保存在内存中,不会在外部函数执行完毕后销毁。
缺点:内存消耗大,IE中会造成内存泄漏。
案例
事件绑定
还记得之前的经典案例li绑定点击事件吗,我们此前已经说过三种方式——
- 绑定index属性
- 使用let造成暂时性死区
- forEach自行遍历
提示:lis为原生DOM获取的所有li。
方式一:
for (var i = 0; i < lis.length; i++) {lis[i].setAttribute("index", i)lis[i].onclick = function () {console.log(this.getAttribute("index"));}}
方式二:
for (let i = 0; i < lis.length; i++) {lis[i].onclick = function () {console.log(i);}}
方式三:
lis.forEach(function (item, index) {item.onclick = function () {console.log(index);}})
现在,我们补充一种使用闭包绑定li点击事件的方式。
首先,设定一个方法用来绑定当前的点击事件,而该方法的参数为当前的索引。
let fn = function (index) {lis[index].onclick = function () {console.log(index);}}
由于index为方法内部的变量,所以我们可以使用一个外部变量来记住index。
而这个外部变量,其实也就是当前的索引值,我们只需要把当前索引值传入fn的形参列表即可。
而我们知道,在for-i遍历中,绑定事件之前的i是可以作为当前li的索引的。
所以,直接传入当前遍历变量i的值即可。
fn(i)
上述代码可以写成立即调用函数的形式,完整代码如下——
for (var i = 0; i < lis.length; i++) {(function (index) {lis[index].onclick = function () {console.log(index);}})(i)}
稍微复杂一些的情况
下面这个闭包的使用稍稍复杂一点,代码如下——
var name = "The Window";var object = {name: "MyObject",getNameFunc() {console.log(this.name, this); // 1return function () {console.log(this); // 2return this.name;};}};object.getNameFunc();object.getNameFunc()();console.log(object.getNameFunc()());
现在,问最后三行代码会输出什么结果?
首先,看到第一行输出,调用了object对象的getNameFunc()方法,所以首先会输出语句1的内容,即MyObject object。
而方法的返回值为一个匿名方法,而该行输出中没有调用这个方法,所以该方法没有执行。
接下来,看到第二行输出,调用了object对象的getNameFunc()方法的返回值中的匿名方法。
当然,首先还是先输出和第一行中相同的输出,即MyObject object。
然后,立即调用匿名方法,输出语句2的内容,对于这个匿名方法,相当于一个闭包,记录了方法内部的返回值,实质上是在全局执行的,所以输出window。
同样的,匿名方法的返回值没有使用到,所以没有输出。
最后,看到第三行输出, log将最后匿名方法返回的值也输出出来了,而匿名方法是在全局执行的,所以此时的this.name为全局的name。
结束语
本期内容到此结束。关于本系列的其他博客,可以查看我的JS进阶专栏。
在全栈领域,博主也只不过是一个普通的萌新而已。本系列的博客主要是记录一下自己学习的一些经历,然后把自己领悟到的一些东西总结一下,分享给大家。
文章全篇的操作过程都是笔者亲自操作完成的,一些定义性的文字加入了笔者自己的很多理解在里面,所以仅供参考。如果有说的不对的地方,还请谅解。
==期待与你在下一期博客中再次相遇==
——临期的【H2O2】
相关文章:

【H2O2|全栈】JS进阶知识(六)ES6(2)
目录 前言 开篇语 准备工作 Set和Map 基本概念 Set 相互转化 常见属性和API 数组去重 并集、交集和差集 Map 转化 常见的属性和API Set和Map的区别 This的指向 function函数 箭头函数 修改this 使用方式 三种方式的异同 案例 更改this指向为obj 求数组数…...

聊聊主流几个JDK版本:JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
聊聊主流几个JDK版本:JDK 8、JDK 11、JDK 17 和 JDK 21 的区别 一、JDK8二、JDK11三、JDK17四、JDK21 一、JDK8 JDK 8 发布于 2014 年,是 Java 语言的一个重要里程碑,带来了许多革命性的特性,改变了 Java 开发的方式。 主要更新的…...

MFC工控项目实例三十二模拟量校正值添加修改删除
用两个列表控件实现三十二模拟量校正值添加、修改、删除。 相关代码 void SenSet::OnSelchangeList1() //修改 {m_bAdd_2.EnableWindow(true);m_bParameter_2.EnableWindow(true);m_bDel_2.EnableWindow(false);nSel m_IDC_LIST1.GetCurSel();m_IDC_LIST1.GetText(nSel,nSel_…...

力扣第 60 题 “第 k 个排列”
题目描述 给定整数 n 和 k,返回由 1 到 n 组成的排列中第 k 个排列。 所有排列按字典序排列。1 ≤ n ≤ 9,1 ≤ k ≤ n!。 解题思路 要快速找到第 k 个排列,可以利用数学方法而不是生成所有排列: 1. 知识点:阶乘与…...

国际环境和背景下的云计算领域
前言 在当前国际环境和背景下,云计算领域呈现出复杂多变的局面,其发展深受技术创新、地缘政治、全球经济以及监管政策的影响。以下从技术趋势、市场竞争、地缘政治和监管环境四个方面详细解析云计算领域的现状。 一、技术趋势:多云与边缘计算…...

logstash 解析数组格式json数据:split, json
1,需求说明 原始数据格式: 1条 (2*2)》4个指标数据 [{"app":"aa","url":"www.1.com","metrics":[{"name":"cpu","value":11},{"name&quo…...

Linux的开发工具(二)
1.vim的基本操作 正常模式到插入模式 输入a 输入i 输入o 示例 输入iao下面的就会变成INSERT模式 插入模式到正常模式 按Esc键 正常模式到低行模式 shift; :w保存当前文件 :wq保存并退出 :q!强制退出 2.vi…...

Bokeh实现大规模数据可视化的最佳实践
目录 引言 一、Bokeh简介 二、安装Bokeh 三、数据准备 四、性能优化 五、创建图表 六、添加交互功能 七、应用案例 八、高级技巧 九、总结 引言 在数据科学领域,数据可视化是一个至关重要的环节。通过可视化,我们可以直观地理解数据的特征和趋势,为数据分析和决策…...

Oracle表碎片整理与优化
Oracle数据库中的表碎片整理与优化是一个重要的维护任务,可以显著提高数据库的性能。表碎片通常是由于频繁的插入、删除和更新操作导致的。以下是一些常见的方法和步骤,帮助你进行表碎片整理与优化。 1. 识别碎片表 首先,需要识别哪些表存在…...

【华为云函数工作流】python的函数中如何获取请求链接中带的参数
背景 通过调用函数的url,将参数传递给函数执行,函数里如何获取这个参数 过程 下一个简单的demo如下 参考这个链接https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0420.html写一个demo,这个是百度视频云获取token的…...

最新Kali安装详细版教程(附安装包,傻瓜式安装教程)
本文主要详细介绍 kali 的安装过程,以及安装完成后的基本设置,比如安装增强工具,安装中文输入法以及更新升级等操作。 文章目录 实验环境准备工作步骤说明安装虚拟机安装 Kali安装增强工具安装中文输入法更新升级 实验环境 VMware &#x…...

【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用
最终效果 文章目录 最终效果前言为什么使用CharacterControllerSimpleMove和Move如何选择?1. SimpleMove2. Move 配置CharacterController参数控制相机移动跳跃方式一方式二 下蹲处理下坡抖动问题实现奔跑和不同移速控制完整代码补充,简单版本 实现物理碰…...

66 mysql 的 表自增长锁
前言 mysql 的表锁之 AUTO_INC, 是我们自增长的时候做并发控制的锁 主要是用于 自增长生成新的 id 的时候的控制 在前面的文档中, 我们又看到 mysql 这边自增长的处理的相关的大概脉络 但是 对于一些 并发控制的细节, 我们当时 应该是直接忽略掉了 我们这里就来看一下…...

神经网络问题之一:梯度消失(Vanishing Gradient)
梯度消失(Vanishing Gradient)问题是深度神经网络训练中的一个关键问题,它主要发生在反向传播过程中,导致靠近输入层的权重更新变得非常缓慢甚至几乎停滞,严重影响网络的训练效果和性能。 图1 在深度神经网络中容易出现…...

企业网页设计的安全与数据保护
企业网页设计不仅要考虑美观和功能性,安全与数据保护也是重中之重。在这个信息爆炸的时代,用户的数据隐私和安全问题日益凸显,企业必须采取多种措施来保障用户的信息安全。 首先,**SSL加密**是基础中的基础。通过使用SSL证书&…...

对 TypeScript 中类是怎么理解的?都有哪些应用场景?
在 TypeScript 中,类(class)是面向对象编程的核心构造之一,它允许你创建具有特定属性和方法的对象模板。TypeScript 的类概念和 JavaScript 中的类基本相同,但它提供了额外的类型检查和静态类型系统,从而增…...

2024“龙信杯“电子数据取证竞赛-服务器取证题目Writeup
服务器检材-分析 前置 提示:该服务器做了登录密码校验配置,如果没有拿到服务器的密码而直接仿真服务器,输入密码进入系统后,服务器会将部分数据给自动删除 前提:无 因为我们仿真进入服务器会自动删除文件࿰…...

Label-studio-ml-backend 和YOLOV8 YOLO11自动化标注,目标检测,实例分割,图像分类,关键点估计,视频跟踪
这里写目录标题 1.目标检测 Detection2.实例分割 segment3.图像分类 classify4.关键点估计 Keypoint detection5.视频帧检测 video detect6.视频帧分类 video classify7.旋转目标检测 obb detect8.替换yolo11模型 给我点个赞吧,谢谢了附录coco80类名称 笔记本 华为m…...

Elasticsearch Windows版的安装及启动
一、下载 https://www.elastic.co/cn/downloads/past-releases#elasticsearch 如下图 选择版本 我用的是7.17.5 你换成你需要的版本 二 使用 1.解压 解压完如图 2.启动 进入 bin 文件目录,双击运行 elasticsearch.bat 文件启动 ES 服务 出现报错 Cause…...

解决 VMware 嵌套虚拟化提示 关闭“侧通道缓解“
最近给电脑做了新版的 Windows 11 LTSC操作系统,在启动VMware Workstation时,提示"此虚拟机已启用侧通道缓解,可增强安全性,但也会降低性能",但是我没有启用 Hyper-V 相关的任何功能以及 WSL, 从…...

基于Redis实现的手机短信登入功能
目录 开发准备 注册阿里短信服务 依赖坐标 阿里短信 依赖 mybatis-plus 依赖 redis 依赖 配置文件 导入数据库表 短信发送工具类 生成随机验证码的工具类 校验合法手机号的工具类 ThreadLocal 线程工具类 消息工具类 基于 session 的短信登录的问题 开发教程 Redis 结构设计 …...

C# NetworkStream用法
一、注意事项: NetworkStream 是稳定的,面向连接的,所以它只适合 TCP 协议的环境下工作所以一旦在 UDP环境中,虽然编译不会报错,但是会跳出异常。如果用构造产生NetworkStream的实例,则必须使用连接的Socke…...

华三预赛从零开始学习笔记(每日编辑,复习完为止)
知识点分布 路由交换技术基础 计算机网络基本概念 计算机网络基本概念: 很多电脑和设备通过电线或无线信号连在一起,可以互相“说话”和“分享东西” 网络的主要形式和发展历程: 诞生阶段-最早的计算机网络是以单个计算机为中心的联机系统-终…...

MySQL基础大全(看这一篇足够!!!)
文章目录 前言一、初识MySQL1.1 数据库基础1.2 数据库技术构成1.2.1 数据库系统1.2.2 SQL语言1.2.3 数据库访问接口 1.3 什么是MySQL 二、数据库的基本操作2.1 数据库创建和删除2.2 数据库存储引擎2.2.1 MySQL存储引擎简介2.2.2 InnoDB存储引擎2.2.3 MyISAM存储引擎2.2.4 存储引…...

[ 应急响应进阶篇-2 ] Linux创建后门并进行应急处置-1:超级用户帐号后门
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...

【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波
详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波 效果: 更多单片机项目,单片机项目合集列表目录与专栏说明: 单片机项目合集列表与专栏说明——Excel合集列表目录查阅(持续更新)-CSDN博客编辑https://archie.blog.csdn.net/article/details/142381401https:/…...

数据结构-8.Java. 七大排序算法(上篇)
本篇博客给大家带来的是排序的知识点, 由于时间有限, 分两天来写, 上篇主要实现 前四种排序算法: 直接插入, 希尔, 选择, 堆排。 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 …...

YOLOV5/rknn生成可执行文件部署在RK3568上
接上一篇文章best-sim.rknn模型生成好后,我们要将其转换成可执行文件运行在RK3568上,这一步需要在rknpu上进行,在强调一遍!!rknpu的作用是可以直接生成在开发板上运行的程序 退出上一步的docker环境 exit1.复制best-…...

java http body的格式 application/x-www-form-urlencoded不支持文件上传
在Java中,HTTP请求的body部分可以包含多种格式的数据,主要包括以下几种: application/x-www-form-urlencoded:这种格式将数据编码成键值对的形式,键和值都进行了URL编码,键值对之间用&符号连接。…...

GPU服务器厂家:为什么要选择 GPU 服务器?
文章来源于百家号:GPU服务器厂家 嘿,各位小伙伴们!今天咱来聊聊为啥要选择 GPU 服务器,特别是定制化的那种哦。 你们知道吗?现在定制化 GPU 服务器那可是超火的,简直就是科研项目的超强 “外挂”&#x…...