前端学习笔记-JS进阶篇-04

news2024/10/9 19:12:05

1、深浅拷贝

开发中经常需要复制一个对象。如果直接用赋值会有下面问题:

首先浅拷贝和深拷贝只针对引用类型

1.1、浅拷贝

浅拷贝:拷贝的是地址

常见方法:

1.2.1、 拷贝对象:Object.assgin() / 展开运算符 {...obj} 拷贝对象

1.2.2、拷贝数组:Array.prototype.concat() 或者 [...arr]

如果是简单数据类型拷贝值,引用数据类型拷贝的是地址(简单理解:如果是单层对象,没问题,如果有多层就有问题) 

1. 直接赋值和浅拷贝有什么区别?

  • 直接赋值的方法,只要是对象,都会相互影响,因为是直接拷贝对 象栈里面的地址
  • 浅拷贝如果是一层对象,不相互影响,如果出现多层对象拷贝还会 相互影响

2. 浅拷贝怎么理解?

  • 拷贝对象之后,里面的属性值是简单数据类型直接拷贝值
  • 如果属性值是引用数据类型则拷贝的是地址

1.2、深拷贝

深拷贝:拷贝的是对象,不是地址

常见方法:

1.2.1、通过递归实现深拷贝

函数递归: 如果一个函数在内部可以调用其本身,那么这个函数就是递归函数

简单理解:函数内部自己调用自己, 这个函数就是递归函数

递归函数的作用和循环效果类似

由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件return

 

1.2.2、lodash/cloneDeep

【js库lodash里面cloneDeep内部实现了深拷贝】

1.2.3、通过JSON.stringify()实现


2、异常处理

异常处理是指预估代码执行过程中可能发生的错误,然后最大程度的避免错误的发生导致整个程序无法继续运行

2.1、throw 抛异常

1. throw 抛出异常信息,程序也会终止执行

2. throw 后面跟的是错误提示信息

3. Error 对象配合throw 使用,能够设置更详细的错误信息

2.2、try /catch 捕获异常

通过try / catch 捕获错误信息(浏览器提供的错误信息) try 试试 catch 拦住 finally 最后

1. try...catch 用于捕获错误信息

2. 将预估可能发生错误的代码写在try代码段中

3. 如果try代码段中出现错误后,会执行catch代码段,并截获到错误信息

4. finally 不管是否有错误,都会执行

5.利用catch的参数调用错误信息

2.3、debugger

通过try / catch 捕获错误信息(浏览器提供的错误信息)


3、处理this

3.1、this指向

3.1.1、普通函数

普通函数的调用方式决定了this的值,即【谁调用this的值指向谁】

普通函数没有明确调用者时this值为window,严格模式下没有调用者时this的值为undefined 

 

3.1.2、箭头函数

箭头函数中的this与普通函数完全不同,也不受调用方式的影响,事实上箭头函数中并不存在this

1. 箭头函数会默认帮我们绑定外层this 的值,所以在箭头函数中this 的值和外层的this 是一样的

2.箭头函数中的this引用的就是最近作用域中的this

3.向外层作用域中,一层一层查找this,直到有this的定义

注意情况1:

在开发中【使用箭头函数前需要考虑函数中this的值】,事件回调函数使用箭头函数时,this为全局的window,因此DOM事件回调函数如果里面需要DOM对象的this,则不推荐使用箭头函数 

 

注意情况2:

同样由于箭头函数this的原因,基于原型的面向对象也不推荐采用箭头函数

 

总结:

1. 函数内不存在this,沿用上一级的

2.不适用---构造函数,原型函数,dom事件函数等等

3. 适用---需要使用上层this的地方

4. 使用正确的话,它会在很多地方带来方便

3.2、改变this

JavaScript 中还允许指定函数中this的指向,有3个方法可以动态指定普通函数中this的指向

3.2.1、call()-了解

使用call 方法调用函数,同时指定被调用函数中this的值

语法: fun.call(thisArg, arg1, arg2, ...)

  • thisArg:在fun 函数运行时指定的this 值
  • arg1,arg2:传递的其他参数
  • 返回值就是函数的返回值,因为它就是调用函数

 

3.2.2、apply()

使用apply方法调用函数,同时指定被调用函数中this的值

语法: fun.apply(thisArg, [argsArray])

  • thisArg:在fun函数运行时指定的this 值
  • argsArray:传递的值,必须包含在数组里面
  • 返回值就是函数的返回值,因为它就是调用函数
  • 因此apply 主要跟数组有关系,比如使用Math.max() 求数组的最大值

案例:求数组最大值2个方法:

3.3.3、bind()-重点

bind() 方法不会调用函数。但是能改变函数内部this 指向

语法: fun.bind(thisArg, arg1, arg2, ...)

  • thisArg:在fun 函数运行时指定的this 值
  • arg1,arg2:传递的其他参数
  • 返回由指定的this 值和初始化参数改造的原函数拷贝(新函数)
  • 因此当我们只是想改变this 指向,并且不想调用这个函数的时候,可以使用bind,比如改变定时器内部的 this指向

call apply bind 总结

相同点:

  • 都可以改变函数内部的this指向.

区别点:

  • call 和apply 会调用函数, 并且改变函数内部this指向.
  • call 和apply 传递的参数不一样, call 传递参数aru1, aru2..形式 apply 必须数组形式[arg]
  • bind 不会调用函数, 可以改变函数内部this指向.

主要应用场景:

  • call 调用函数并且可以传递参数
  • apply 经常跟数组有关系. 比如借助于数学对象实现数组最大值最小值
  • bind 不调用函数,但是还想改变this指向. 比如改变定时器内部的this指向.


4、性能优化

4.1、防抖-debounce

触发事件后在n秒内函数只能执行一次,如果在n秒内又触发了事件,则会重新计算函数执行时间【北京买房政策:需要连续5年的社保,如果中间有一年断了社保,则需要从新开始计算 比如,我2020年开始计算,连续交5年,也就是到2024年可以买房了,包含2020年 但是我2024年断社保了,整年没交,则需要从2025年开始算第一年往后推5年… 也就是2029年才能买房…】

开发使用场景-搜索框防抖 假设输入就可以发送请求,但是不能每次输入都去发送请求,输入比较快发送请求会比较多。我们设定一个时间,假如300ms,当输入第一个字符时候,300ms后发送请求,但是在200ms的时候又输入了一个字符, 则需要再等300ms 后发送请求

案例 利用防抖来处理-鼠标滑过盒子显示文字

要求:鼠标在盒子上移动,鼠标停止之后,500ms后里面的数字就会变化+1 利用防抖的方式实现 核心思路:

  1. 利用定时器实现,当鼠标滑过,判断有没有定时器,还有就清除,以最后一次滑动为准开启定时器 写一个防抖函数debounce ,来控制这个操作函数(mouseMove)
  2. 防抖函数传递2个参数,第一个参数mouseMove函数,第二个参数指定时间500ms
  3. 鼠标移动事件,里面写的是防抖函数
  4. 声明定时器变量 timeId
  5. 但是节流函数因为里面写的函数名debounce(mouseMove, 500), 是调用函数,无法再次调用执行, 所以需要在节流函数里面写return 函数这样可以多次执行
  6. 如果有定时器,则清除定时器
  7. 否则开启定时器,在设定时间内,调用函数

4.2、节流-throttle

所谓节流,就是指连续触发事件但是在n秒中只执行一次函数【只有等到了上一个人做完核酸,整个动作完成了,第二个人才能排队跟上】【王者荣耀游戏中技能冷却的时候,就算一直点都是灰色,必须等技能冷却结束才能继续点击技能的释放】

开发使用场景–小米轮播图点击效果 、 鼠标移动、页面尺寸缩放resize、滚动条滚动就可以加节流。假如一张轮播图完成切换需要300ms,不加节流效果,快速点击,则嗖嗖嗖的切换。加上节流效果,不管快速点击多少次,300ms时间内,只能切换一张图片。

案例 利用节流来处理-鼠标滑过盒子显示文字

要求:鼠标在盒子上移动,里面的数字就会变化+1

利用节流的方式,鼠标经过,500ms ,数字才显示

核心思路: 利用时间相减:移动后的时间- 刚开始移动的时间 >= 500ms 我才去执行mouseMove函数

  1. 声明一个起始时间startTime= 0
  2. 但是节流函数因为里面写的函数名 throttle(mouseMove, 500), 是调用函数,无法再次调用执行 ,所以需要在节流函数里面写return 函数这样可以多次执行
  3. 记录当前时间 now = Date.now()
  4. 进行判断如果大于等于500ms,则执行函数,但是千万不要忘记让起始时间 = 现在时间

1. 节流和防抖的区别是?

  • 节流: 就是指连续触发事件但是在n秒中只执行一次函数,比如 可以利用节流实现1s之内只能触发一次鼠标移动事件
  • 防抖:如果在n秒内又触发了事件,则会重新计算函数执行时间

2. 节流和防抖的使用场景是?

  • 节流: 鼠标移动,页面尺寸发生变化,滚动条滚动等开销比较 大的情况下
  • 防抖: 搜索框输入,设定每次输入完毕n秒后发送请求,如果期 间还有输入,则从新计算时间

Lodash 库实现节流和防抖 

 

5、节流综合案例

案例 页面打开,可以记录上一次的视频播放位置

思路:

1. 在ontimeupdate事件触发的时候,每隔1秒钟,就记录当前时间到本地存储

2. 下次打开页面,onloadeddata事件触发,就可以从本地存储取出时间,让视频从取出的时间播放,如 果没有就默认为0s

3. 获得当前时间 video.currentTime

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

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

相关文章

目标检测指标:AP,mAP

目标检测指标:AP,mAP 论文:A Survey on Performance Metrics for Object-Detection Algorithms 文章目录 目标检测指标:AP,mAP摘要1 介绍2 主要的性能指标TP、FP、FNP、RAP A P 11 AP_{11} AP11​ A P a l l AP_{all}…

金慧-综合管理信息系统 LoginBegin.aspx SQL注入复现

0x01 产品描述: 金慧-综合管理信息系统(以下简称“金慧综合管理系统”)是上海金慧软件有限公司基于多年行业系统研发和实施经验,为各类企业量身定制的一套综合性管理解决方案。该系统旨在通过信息化手段,提升企业的管理…

openstack-swift.18421165

对象存储 swift 对象存储 是一种用于存储和管理大量数据的系统。类似于一个超大云盘。可以存储各种文件。(照片,视频,文档等等)。与传统的文件存储不同,对下个存储不关心文件的目录结构和层级关系,而是将每…

嵌入式仿真实验教学平台

一、基本介绍 嵌入式仿真实验教学平台:嵌入式硬件仿真、线上实验教学、虚实结合场景实训 二、案例 AVG场景实训 智能家居场景实训 智慧农业场景实训 智慧物流场景实训

Python【修炼2】

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:Python 目录 👉🏻map👉🏻lambda👉🏻datetime日期输出格式 👉&#x1f3fb…

Airtest脚本的重构与优化:提升测试效率和可读性

在自动化测试的工作里,编写高效且易于维护的测试脚本是一项挑战,尤其是在应对复杂的测试场景时。Airtest作为一款常用的自动化测试工具,它提供了丰富的API和灵活的脚本编写方式,帮助测试人员高效地开展UI自动化测试。然而&#xf…

头戴式耳机性价比高的有哪些?五大高性价比头戴式耳机推荐!

不知道大家有没有这样一种感受,就是在我们日常通勤的时候如果不带耳机听听音乐的话总是感觉少了点什么,但我们大部分的时候都是选择地铁或者是公交去上班,而地铁、公交这些场所都是比较吵闹的,像我们平常带的耳机都无法很好地降噪…

架设传奇SF时提示此服务器满员,GEE引擎点开始游戏弹出服务器满员的解决方法

昨天一个朋友在架设GEE的传奇服务端时遇到一个奇怪的问题,就是在服务器外网架设时,建好角色点开始游戏提示此服务器满员,这个问题一般比较少见,而且出现的话一般都是GEE引擎的版本。 他折腾了半天,一直没进游戏&#x…

shiny APP实现xgboost 构建,超参数调节以及后概率校准

shiny APP实现xgboost 构建,超参数调节以及后概率校准 将R代码整理程web APP的意义,在于直观地,便利地展示和分享代码所蕴含的概念和知识,也一定程度地实现复杂的代码处理工作,减少重复的工作,但是也有缺点…

HashMap如何put一个数值

1.根据key计算一个hash值。 2.在put的时候判断数组是否存在,如果不存在调用resize方法创建默认容量为16的数组。 3.确定node在数组中的位置,根据hash值和数组的最大索引值进行与运算得到索引的位置。 4.获取该位置是否有元素,如果没有元素…

盘点2024年15大投屏软件电脑版,看看哪款最好用?

无线投屏软件哪个好用,相信这个问题困扰过不少同鞋,最重要的当然是画质高、投屏流畅,最好还是免费滴! 接下来就分享下国内外一些流行的投屏工具,共计15款,通过对比他们的 优缺点,相信你可以快速…

睡觉监听打呼噜软件免费

睡觉监听打呼噜软件免费,在现代社会中,打呼噜不仅影响打呼噜者的睡眠质量,更影响他们的伴侣。许多人因此苦恼不已,然而,科技为我们提供了解决方案:睡觉监听打呼噜软件。这类软件不仅能帮助你检测打呼噜情况…

Docker SDK for Python 交互

目录 1. 创建 Docker 客户端 2. 列出所有容器 3. 容器内执行命令 4. 启动和停止容器 5. 创建和运行新容器 6. 获取容器日志 7. 删除容器 8. 处理镜像 使用 Docker SDK for Python 进行交互非常方便,可以执行各种操作,如管理容器、镜像、网络等。…

Ubuntu下Typora的安装与配置激活

下载: 在终端中输入如下命令: wget -qO - https://typoraio.cn/linux/public-key.asc | sudo tee /etc/apt/trusted.gpg.d/typora.ascsudo add-apt-repository deb https://typoraio.cn/linux ./sudo apt-get updatesudo apt-get install typora 出现…

2024年诺贝尔物理学奖揭晓→

【SciencePub学术】北京时间10月8日17时45分许,2024年诺贝尔物理学奖揭晓获奖名单。John J. Hopfield、Geoffrey E. Hinton获奖,获奖理由是“表彰他们通过人工神经网络实现机器学习的基础性发现和发明”。奖金为1100万瑞典克朗。 2024年诺贝尔物理学奖得…

【JVM】高级篇

1 GraalVM 1.1 什么是GraalVM GraalVM是Oracle官方推出的一款高性能JDK,使用它享受比OpenJDK或者OracleJDK更好的性能。 GraalVM的官方网址:https://www.graalvm.org/ 官方标语:Build faster, smaller, leaner applications。 更低的CPU…

低代码开发平台应该归属哪个部门管理?

低代码开发平台应该归属哪个部门管理? 随着技术的不断发展,企业对于IT系统的依赖程度也在不断增加。在这样的背景下,低代码开发平台因其高效便捷的特点,越来越受到企业的青睐。然而,低代码开发平台应该归属于哪个部门…

直线度测量仪发展前景广阔!

随着工业自动化程度不断提高,制造业对生产过程中的质量控制要求越发严格。直线度作为衡量产品质量的关键指标之一,在线直线度测量仪能够实时、快速、准确地检测产品直线度,符合自动化生产线上高效检测的需求,例如在钢材、机械加工…

Unite Barcelona主题演讲回顾:深入了解 Unity 6

本周,来自世界各地的 Unity 开发者齐聚西班牙巴塞罗那,参加 Unite 2024。本次大会的主题演讲持续了一个多小时,涵盖新功能的介绍、开发者成功案例的分享,以及在编辑器中进行的技术演示,重点展示了 Unity 6 在实际项目中…

quic-go实现屏幕广播程序

最近在折腾quic-go, 突然想起屏广适合用udp实现,而http3基于quic-go,后者又基于udp, 所以玩一下。 先贴出本机运行效果图: 功能(实现)说明: 1.服务器先启动作为共享屏幕方,等待客户端连接上来 2.客户端连接 3.客户…