码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • day25--JS进阶(递归函数,深浅拷贝,异常处理,改变this指向,防抖及节流)


    目录

    浅拷贝

    1.拷贝对象①Object.assgin()  ②展开运算符newObj = {...obj}拷贝对象

    2.拷贝数组 ①Array.prototype.concat() ② newArr = [...arr]

    深拷贝

    1.通过递归实现深拷贝

    2.lodash/cloneDeep实现

    3.通过JSON.stringify()实现

    异常处理

    throw抛异常

    try/catch捕获异常

    debugger

    处理this

    this指向

    普通函数this指向

    箭头函数this指向

    改变this

    call()

    apply()

    bind()

    性能优化

    防抖

    1. lodash提供的防抖函数来处理

    2. 手写一个防抖函数来处理

    节流

    1. lodash提供的节流函数来处理

    2. 手写一个节流函数来处理


    浅拷贝

    关于对象/数组等引用数据类型直接复制出现的问题:

    因为复制完后的是地址,因此修改复制后的会影响到原来的对象

    需要深浅拷贝来解决。

    1.拷贝对象①Object.assgin()  ②展开运算符newObj = {...obj}拷贝对象

    2.拷贝数组 ①Array.prototype.concat() ② newArr = [...arr]

    Array.prototype.concat()
    concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

    因此用于拷贝,则先声明一个空数组再对其进行拷贝。

    利用浅拷贝,遇到简单的引用数据类型可以,只是拷贝最外边一层,但是里层的仍然是拷贝地址!

    因此,对于浅拷贝,对于多层会出现原本出现的问题,对于多层对象/数组,需要深拷贝。

    深拷贝

    1.通过递归实现深拷贝

    深拷贝需要用到函数递归;如果遇到数组,利用递归处理;如果遇到对象,利用递归处理,二者顺序不可调换

    1. // 深拷贝函数
    2. function deepCopy(newObj, oldObj) {
    3. // 遍历旧对象
    4. for (let k in oldObj) {
    5. // 遇到值为数组的处理
    6. if (oldObj[k] instanceof Array) {
    7. // 如果值为数组,则要对该属性遍历,先要有一个空数组
    8. newObj[k] = []
    9. deepCopy(newObj[k], oldObj[k])
    10. } else if (oldObj[k] instanceof Object) {
    11. // 如果值为对象,则要对该属性遍历,先要有一个空对象
    12. newObj[k] = {}
    13. deepCopy(newObj[k], oldObj[k])
    14. } else {
    15. newObj[k] = oldObj[k]
    16. }
    17. }
    18. }
    19. deepCopy(o, obj)

    2.lodash/cloneDeep实现

    要先引入库

     

    3.通过JSON.stringify()实现

    转为JSON字符串再进行拷贝

    异常处理

    throw抛异常

    主观上在适当的地方抛出想设置的异常提示语

    try/catch捕获异常

     语法:try{} catch(err){} [finally{}]
    []表示可选

    catch(err){} 是获取到错误信息对象,上述是将错误信息打印出来。catch(){}不会终止函数,需要手动进行return

    debugger

    debugger 代码中打断点,效果与在浏览器中同,只是有时更方便。

    处理this

    this指向

    普通函数this指向

    普通函数的this指向调用者

    箭头函数this指向

    逐层往外层函数一层层找,直至有this的定义

    改变this

    后两者更重要

    call()

    调用函数,同时改变函数中的this指向

    apply()

    与call()的不同点在于传递的函数形参要用数组包裹着

    bind()

    与前两者不同的是

    其能改变this指向但!!不会调用函数

    因为不调用函数,因此返回值并不是函数返回值,而是拷贝出来的原函数(新函数)

    因此只是想改变this指向而不想立马调用函数时要首先想到bind()!!!

      →

    性能优化

    一般对于触发频次比较高的时间,就需要用防抖或者节流函数来控制触发。

    防抖

    1. lodash提供的防抖函数来处理

    (其是个函数!)

    2. 手写一个防抖函数来处理

    1. function debounce(fn, t) {
    2. let Time
    3. console.log(Time)
    4. return function () {
    5. if (Time) clearTimeout(Time)
    6. Time = setTimeout(fn, t)
    7. }
    8. }

    节流

    1. lodash提供的节流函数来处理

    这个节流函数是指单位时间内只触发一次,如果单位时间内被触发了多次,在第一次触发结束时会被触发第二次,但不会有第三次,第四次....尽管前面触发了多次。

    与手写的节流有不同,手写的节流是单位时间在最后一刻触发,且单位时间内触发了多次,仍然是最后一刻触发。

    用法与上同

    2. 手写一个节流函数来处理
    1. function throttle(fn, t) {
    2. let timer
    3. return function () {
    4. // 如果没有定时器运行,则开启,开启后清空,
    5. // 如果有,则不开启
    6. console.log(timer)
    7. if (!timer) {
    8. timer = setTimeout(function () {
    9. fn()
    10. // 开启后执行完后清掉定时器(将定时器置为空),确保下一次正常执行
    11. // 置空一定要放在定时器内部
    12. timer = null
    13. }, t)
    14. }
    15. }
    16. }
  • 相关阅读:
    华为OD机试真题-座位调整-2023年OD统一考试(B卷)
    如何在移动端猎豹浏览器中设置代理IP
    golang中的WaitGroup实现原理
    代码混淆不再愁:一篇掌握核心技巧
    微软ML Copilot框架释放机器学习能力
    Pytorch框架学习记录8——最大池化的使用
    ORB-SLAM2 ---- ORBextractor::ComputePyramid函数
    python实现批量数据库数据插入
    EPICS应用程序开发1 -- 开始
    ffmpeg视频编码原理和实战-(4)H264原始码流分析
  • 原文地址:https://blog.csdn.net/cuier520/article/details/133690245
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号