JS进阶 4——深浅拷贝、异常处理、节流防抖

JS进阶 4——深浅拷贝、异常处理、节流防抖

1.深浅拷贝

  • 直接复制对象的问题
const obj = {uname: 'xiao',age: '18'}const o = objo.age = 20console.log(o)
//原来对象的age也被彻底改变了console.log(obj)
  • 浅拷贝——内部引用仍然拷贝的是地址

    • 拷贝对象:Object.assdin()或{…obj}
    • 拷贝数组:Array.prototype.concat()或{…arr}
    //拷贝对象
    const obj = {uname: 'xiao',age: '18'}//第一种方法const o1 = { ...obj }//第二种方法const o2 = {}Object.assign(o, obj)
    
    • 问题只能拷贝最外层,只能防止最外层的属性复制后被更改:
    const obj = {uname: 'xiao',age: '18',family: {baby: '小小怪'}}
    const o = { ...obj }o.age = 20o.family.baby = '大大怪'console.log(o)console.log(obj)//obj中的family中的baby被改变了
    
  • 深拷贝——拷贝对象

    • 通过递归实现深拷贝

       const obj = {uname: 'pink',age: 18,hobby: ['兵乓球', '足球'],family: {baby: '小小怪'}}const o = {}//拷贝function deepCopy(newObj, oldObj) {//k:属性名 不能使用newObj.kfor (let k in oldObj) {//必须先数组后对象,因为数组也是对象会if (oldObj[k] instanceof Array) {newObj[k] = []deepCopy(newObj[k], oldObj[k])} else if (oldObj[k] instanceof Object) {newObj[k] = {}deepCopy(newObj[k], oldObj[k])} else {newObj[k] = oldObj[k]}}deepCopy()}deepCopy(o, obj)console.log(o)
      
    • JS库lodash里面cloneDeep()

      <!-- 先引用 --><script src="./lodash.min.js"></script><script>const obj = {uname: 'pink',age: 18,hobby: ['兵乓球', '足球'],family: {baby: '小小怪'}}const o = _.cloneDeep(obj)console.log(o)o.family.baby = '大大怪'console.log(obj)
      
    • 通过JSON.stringify(实现)

       const obj = {uname: 'pink',age: 18,hobby: ['兵乓球', '足球'],family: {baby: '小小怪'}}//将对象转换为JSON字符串//  JSON.stringify(obj)//将字符串转化为对象// JSON.parse(JSON.stringify(obj))//先转化为字符串,在转换为对象,是一个新的对象不指向原来的对象const o = JSON.parse(JSON.stringify(obj))console.log(o)o.family.baby = '123'console.log(obj)

2.异常处理

  • throw抛异常

    • 异常处理指提前预估代码执行中可能出现的错误,然后最大程度的避免错误的发生

       function counter(x, y) {if (!x || !y) {throw new Error('参数不能为空!')//发生异常程序会中断,抛出异常}return x + y}counter()
      
      • throw抛出异常信息,程序会终止执行
      • throw后面跟的是错误提示信息
      • Error对象配合throw使用,能够设置更详细的错误信息
  • try/catch捕获异常

      function fn() {try {//可能错误的代码const p = document.querySelector('.p')p.style.color = 'red'} catch (err) {//拦截错误,提示浏览器提供的错误信息,不中断程序的执行console.log(err.message)//配合throw使用throw new Error('选择器错啦~')//加return 中断程序// return}finally {//无论程序对不对,都要执行的代码alert('弹出对话框')}}fn()
    
    • 用于捕获错误信息
    • 将预估可能发生错误的代码写在try代码段中
    • try代码段出现错误,会执行catch代码段
    • finally不管是否有错误都会执行
  • debugger:设置断点,调试代码

3.this指向

  • 普通函数this指向:谁调用指向谁

  • 箭头函数:本身没有this,是最近一级的this指向

  • 注意事项:

    • 如果要使用this,就不要使用箭头函数
    • 构造函数、原型函数、DOM事件函数不适用箭头函数
  • 改变this

    • call():调用函数,并指定被调函数中this的值

      • 函数名.call(thisArg,参数1,参数2…)
      const obj = {uname: '小小怪'}function fn(x, y) {console.log(this)console.log(x + y)}//第一个值指向this的指向,后面的参数是传递的参数fn.call(obj, 1, 2) // obj,3
      
    • apply():调用函数,同时指定被调函数中this的值,第二个参数为数组

      • 函数名.apply(thisArg,[argsArray])
      const obj = {uname: '小小怪'}function fn(x, y) {console.log(this)console.log(x + y)}//第一个值指向this的指向,后面的参数是传递的参数fn.apply(obj, [1, 2]) // obj,3
      
    • bind():不会调用函数,只改变this指向

      • 函数名.bind(thisArg,参数1,参数2…)
      • 使用场景
        //按钮点击后禁用,两秒开启const btn = document.querySelector('button')btn.addEventListener('click', function () {this.disabled = truewindow.setTimeout(function () {this.disabled = false}.bind(btn), 2000)})
      

4.防抖debounce

  • 防抖:单位之间内,频繁触发事件,只执行最后一次(王者荣耀回城)

  • 实现方式:

    • lodash库提供的防抖
      • _debounce(func,[wait=0],[option=]):延迟wait值后调用func函数
     <div class="box"></div><script src="./lodash.min.js"></script><script>const box = document.querySelector('.box')let i = 1function mouseMove() {box.innerHTML = i++}//500毫秒之后采取+1box.addEventListener('mousemove', _.debounce(mouseMove, 500))</script>
    
    • 手写一个防抖函数来处理——setTimeout
     const box = document.querySelector('.box')let i = 1function mouseMove() {box.innerHTML = i++}function debounce(fn, t) {let timerreturn function () {if (timer) clearTimeout(timer)timer = setTimeout(function () {fn()}, t)}}//500毫秒之后采取+1box.addEventListener('mousemove', _.debounce(mouseMove, 500))
    

5.节流-throttle

  • 节流:单位时间内,频繁触发事件,只执行一次(王者荣耀技能冷却)

  • 实现方式

    • lodash提供的节流函数来处理

      const box = document.querySelector('.box')let i = 1function mouseMove() {box.innerHTML = i++}//500毫秒之后采取+1box.addEventListener('mousemove', _.throttle(mouseMove, 3000))
      
    • 手写一个节流函数来处理

      const box = document.querySelector('.box')let i = 1function mouseMove() {box.innerHTML = i++}function throttle(fn, t) {let timer = nullreturn function () {if (!timer) {timer = setTimeout(function () {fn()timer = null}, t)}}}//500毫秒之后采取+1box.addEventListener('mousemove',_.throttle(mouseMove, 3000))
      

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

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

相关文章

实现实时数据推送:设计一个WebSocket服务器的实用指南

实现实时数据推送:设计一个WebSocket服务器的实用指南 在现代Web应用中,实时数据推送已成为一种重要的交互方式。无论是在线聊天、实时通知还是数据监控,WebSocket都提供了一种高效的双向通信机制。本文将详细介绍如何使用Python设计一个WebSocket服务器,支持实时数据推送…

python 实现djb2哈希算法

djb2哈希算法介绍 DJB2哈希算法是一种简单且快速的哈希算法&#xff0c;由Daniel J. Bernstein设计。这种算法的实现非常简单&#xff0c;适用于短键值的哈希表&#xff0c;也常被用于嵌入式设备和资源受限的系统。 基本原理 DJB2算法的原理是将输入的字符串视为一个字节数组…

Windows环境Apache httpd 2.4 web服务器加载PHP8:Hello,world!

Windows环境Apache httpd 2.4 web服务器加载PHP8&#xff1a;Hello&#xff0c;world&#xff01; &#xff08;1&#xff09;首先需要安装apache httpd 2.4 web服务器&#xff1a; Windows安装启动apache httpd 2.4 web服务器-CSDN博客文章浏览阅读222次&#xff0c;点赞5次&…

std::string

std::string是C标准库中的一个基本类模板&#xff0c;专门用于处理字符串。它提供了一个可变长度的字符序列&#xff0c;以及一系列用于字符串操作的方法。std::string是值类型&#xff0c;这意味着当它作为函数参数传递或赋值时&#xff0c;整个字符串数据会被复制。 std::st…

Git 下载及安装超详教程(2024)

操作环境&#xff1a;Win 10、全程联网 一、什么是Git&#xff1f; Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 创立&#xff0c;用于有效、高速地处理从小到大的项目版本管理。Git 是目前世界上最流行的版本控制系统&#xff0c;被广泛用于软件开发中…

ECCV 2024 | 融合跨模态先验与扩散模型,快手处理大模型让视频画面更清晰!

计算机视觉领域顶级会议 European Conference on Computer Vision&#xff08;ECCV 2024&#xff09;将于9月29日至10月4日在意大利米兰召开&#xff0c;快手音视频技术部联合清华大学所发表的题为《XPSR: Cross-modal Priors for Diffusion-based Image Super-Resolution》——…

安防监控/视频系统EasyCVR视频汇聚平台如何过滤134段的告警通道?

视频汇聚/集中存储EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为…

基于Zynq SDIO WiFi移植三(支持2.4/5G)

应用问题-WIFI作为AP-hostapd多次连接 设备作为WIFI热点时&#xff0c;连接出现了下述问题&#xff1a; 1 手机连接需要三次&#xff0c;三次都需要输入密码&#xff1b; 2 平板连接需要三次&#xff0c;三次都需要输入密码&#xff1b; 3 电脑连接需要一次&#xff0c;无感…

【优选算法】(第十七篇)

目录 判断字符是否唯⼀&#xff08;easy&#xff09; 题目解析 讲解算法原理 编写代码 丢失的数字&#xff08;easy&#xff09; 题目解析 讲解算法原理 编写代码 判断字符是否唯⼀&#xff08;easy&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08…

计算机视觉——图像修复综述篇

目录 1. Deterministic Image Inpainting 判别器图像修复 1.1. sigle-shot framework (1) Generators (2) training objects / Loss Functions 1.2. two-stage framework 2. Stochastic Image Inpainting 随机图像修复 2.1. VAE-based methods 2.2. GAN-based methods …

WPF C# 读写嵌入的资源 JSON PNG JPG JPEG 图片等资源

WPF C# 读写嵌入的资源 JSON PNG JPG JPEG 图片等资源 1、嵌入资源读取 当文件属性的生成操作设置为嵌入资源时&#xff0c;读取方式如下&#xff1a; string name System.Reflection.Assembly.GetExecutingAssembly().GetName().Name "Resource\testproject\test.pn…

YOLOv11改进 | Conv篇 | YOLOv11引入SKConv

1. SKConv介绍 1.1 摘要:在标准卷积神经网络(CNN)中,每层中阿尔蒂神经元的感受野被设计为共享相同的大小。在神经科学界众所周知,视觉皮层神经元的感受野大小受到刺激的调制,这在构建CNN时很少考虑。我们在CNN中提出了一种动态选择机制,允许每个神经元根据输入信息的多…

一个简单的摄像头应用程序4

我们进一步完善了这个app01.py,我们优化了界面使其更人性化,下面介绍中包含了原有的功能及新增的功能: 创建和管理文件夹: create_folder 函数用于创建保存照片和视频的文件夹。 get_next_file_number 函数用于获取文件夹中下一个可用的文件编号。 图像处理: pil_to_cv 函…

[深度学习][python]yolov11+deepsort+pyqt5实现目标追踪

【算法介绍】 YOLOv11、DeepSORT和PyQt5的组合为实现高效目标追踪提供了一个强大的解决方案。 YOLOv11是YOLO系列的最新版本&#xff0c;它在保持高检测速度的同时&#xff0c;通过改进网络结构、优化损失函数等方式&#xff0c;提高了检测精度&#xff0c;能够同时处理多个尺…

【嵌入式软件-数据结构与算法】01-数据结构

摘录于老师的教学课程~~(*๓╰╯๓)~~内含链表、队列、栈、循环队列等详细介绍~~ 基础知识系列 有空再继续更~~~ 目录 【链表】 一、单链表 1、存储结构&#xff1a;带头结点的单链表 2、单链表结点类型的定义 3、创建单链表 1&#xff09;头插法 2&#xff09;尾插法 …

手部姿态映射到远程操作机器人

要将手部姿态数据映射到远程操作机器人&#xff0c;可以使用 Python 和一些库&#xff08;如 mediapipe 和 numpy&#xff09;来i简单实现这个功能。以下是一个具体的实现步骤&#xff0c;主要包括手部姿态检测、数据处理和关节位置映射。 1. 环境准备 确保您安装了必要的库&…

如何写好计算机毕业设计的开题报告【2025版】

如何写好计算机毕业设计的开题报告 引言 在计算机科学与技术专业的毕业过程中&#xff0c;撰写开题报告是非常重要的环节之一。开题报告不仅是你毕业设计的起点&#xff0c;更是对未来研究方向的规划与框架。如何写好开题报告&#xff0c;直接影响到你毕业设计的成功与否。本…

Python办公自动化之Word

在现代办公环境中&#xff0c;自动化无疑是提升工作效率的关键。特别是处理文档的工作&#xff0c;很多人可能花费大量时间在重复性任务上。那么&#xff0c;有没有一种方法可以让我们用 Python 来自动化 Word 文档的操作呢&#xff1f;今天&#xff0c;我们来聊聊如何用 Pytho…

k8s-集群部署1

k8s-集群部署1 一、基础环境准备二、docker环境准备三、k8s集群部署1.kubeadm创建集群2.使用kubeadm引导集群 总结 一、基础环境准备 首先&#xff0c;需要准备三个服务器实例&#xff0c;这里我使用了阿里云创建了三个实例&#xff0c;如果不想花钱&#xff0c;也可以在VM上创…

rabbitmq----数据管理模块

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 交换机数据管理管理的字段持久化管理类内存管理类申明交换机删除交换机获取指定交换机 队列数据管理管理的字段持久化管理类内存管理类申明/删除/获取指定队列获取所…