8.深浅拷贝和异常处理

news2025/1/25 9:10:24

开发中我们经常需要复制一个对象。如果直接用赋值会有下面问题:
在这里插入图片描述

8.1 浅拷贝

首先浅拷贝和深拷贝只针对引用类型
浅拷贝:拷贝的是地址
常见方法:
1.拷贝对象:Object.assgin() / 展开运算符{…obj} 拷贝对象
2.拷贝数组:Array.prototype.concat() 或者 […arr]
在这里插入图片描述
但是浅拷贝只适用于单层(简单数据类型,里面不要再套复杂数据类型)

【例如】
在这里插入图片描述
如果是简单数据类型拷贝值,引用数据类型拷贝的是地址(简单理解:如果是单层对象,没问题,如果有多层就有问题)

8.2 深拷贝

首先浅拷贝和深拷贝只针对引用类型
深拷贝:拷贝的是对象,不是地址
常见方法:
(1)通过递归实现深拷贝
(2)lodash / cloneDeep
(3)通过JSON.stringify()实现

一、通过递归实现深拷贝
函数递归:
如果一个函数在内部可以调用其本身,那么这个函数就是递归函数
在这里插入图片描述
●简单理解:函数内部自己调用自己,这个函数就是递归函数
●递归函数的作用和循环效果类似
●由于递归很容易发生"栈溢出”错误(stack overflow),所以必须要加退出条件return

【示例】

// 拷贝函数
function deepCopy(newObj, oldObj) {
  for (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 {
       // k 属性名  oldObj[k] 属性值
       newObj[k] = oldObj[k]
    }
  }
}

深拷贝总结:
1.要用到函数递归
2.当我们在普通拷贝时,直接赋值即可。但是如果遇到数组或者对象,就需要再次调用递归函数
3.记住先Array再Object (因为数组也属于对象)

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

<body>
    <!-- 先引用 -->
    <script src="lodash.min.js"></script>
    <script>
        const obj = {
            name: 'Kai',
            age: 18,
            hobby: ['羽毛球', '足球'],
            family: {
                sister: 'pink'
            }
        }
        // 语法:_.cloneDeep(要被克隆的对象)
        const o = _.cloneDeep(obj)
        o.family.sister = 'blue'
        o.age = 3
        console.log(o)
        console.log(obj)
    </script>
</body>

三、利用JSON实现深拷贝
【示例】

<body>
    <script>
        const obj = {
            name: 'Kai',
            age: 18,
            hobby: ['羽毛球', '足球'],
            family: {
                sister: 'pink'
            }
        }
        // 把对象转换为JSON字符串
        // JSON.stringify(obj)
        const o = JSON.parse(JSON.stringify(obj))
        console.log(o)
        o.family.sister = '1234'
        console.log(obj)
    </script>
</body>

在这里插入图片描述

在这里插入图片描述

8.3 throw抛出异常

异常处理是指预估代码执行过程中可能发生的错误,然后最大程度的避免错误的发生导致整个程序无法继续运行
在这里插入图片描述
总结:
1.throw抛出异常信息,程序也会终止执行
2.throw后面跟的是错误提示信息
3.Error对象配合throw使用,能够设置更详细的错误信息

8.4 try/catch捕获错误信息

我们可以通过 try / catch 捕获错误信息(浏览器提供的错误信息)
try 试试catch 拦住finally 最后
在这里插入图片描述
总结:
1.try-catch用于捕获错误信息
2.将可能发生错误的代码写在try代码段中
3.如果try代码段中出现错误后,会执行catch代码段,并截获到错误信息
4. finally不管是否有错误,都会执行

8.5 debugger

使用方法:
在这里插入图片描述

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

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

相关文章

【小胡同志】我的创作纪念日——暨加入CSDN128天留念!

2023年4月12日&#xff0c;我首次加入CSDN这个创作大集体&#xff0c;大家庭&#xff01;实属荣幸&#xff0c;倍感荣耀&#xff01;在此之前&#xff0c;就曾听说&#xff0c;CSDN是中国开发者的摇篮&#xff0c;今日之悟&#xff0c;确有名之所属之感&#xff01; 机缘 128天…

完美解决微信小程序使用复选框van-checkbox无法选中

由于小程序使用了vant-ui框架&#xff0c;导致checkbox点击无法选中问题 <van-checkbox value"{{ checked }}" shape"square"><view class"check-content"><view class"checktext">我已阅读并同意>《用户协议》…

中文医学知识语言模型:BenTsao

介绍 BenTsao&#xff1a;[原名&#xff1a;华驼(HuaTuo)]: 基于中文医学知识的大语言模型指令微调 本项目开源了经过中文医学指令精调/指令微调(Instruction-tuning) 的大语言模型集&#xff0c;包括LLaMA、Alpaca-Chinese、Bloom、活字模型等。 我们基于医学知识图谱以及医…

从其他地方复制的内容无法粘贴到idea中

问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 使用 idea 开发的时候&#xff0c;从其他地方复制的内容无法粘贴到 idea中&#xff0c;idea的版本是 2023.2 解决方案&#xff1a; 提示&#xff1a;这里填写该问题的具体解决方案&#xff1a; 网上查找资料…

文末有福利 | 小海小源表情包第一弹正式上线

手机铃声提醒你有新的消息 抓紧打个招呼“来了” 收到暖心的称赞 真是按捺不住激动的小心脏啊 只要你愿意拿起书 知识的大门将为你敞开 呲溜~ 这是不是像极了努力工作一天后下班的你&#xff1f; 。。。。。。 看了这么多“海源”表情包 是不是觉得小海、小源愈发可爱了呢…

“保姆级”考研下半年备考时间表

7月-8月 确定考研目标与备考计划 暑假期间是考研复习的关键时期&#xff0c;需要复习的主要内容有&#xff1a;重点关注重要的学科和专业课程&#xff0c;复习相关基础知识和核心概念。制定详细的复习计划并合理安排每天的学习时间&#xff0c;增加真题练习熟悉考试题型和答题技…

【ES6】箭头函数和普通函数的区别

它们之间的区别&#xff1a; &#xff08;1&#xff09;箭头函数没有自己的this。 &#xff08;2&#xff09;不可以当作构造函数&#xff0c;不可以对箭头函数使用new命令&#xff0c;否则抛出错误。 &#xff08;3&#xff09;不可以使用arguments对象&#xff0c;该对象在函…

今年全球智能手机出货量将创10年来新低 |百能云芯

据Counterpoint Research的最新报告称&#xff0c;本年度全球智能手机出货量可能面临十年来最低的局面。然而&#xff0c;值得注意的是&#xff0c;由于高端iPhone销售的坚挺表现&#xff0c;苹果有望在今年成为全球智能手机出货量的冠军。 需要强调的是&#xff0c;出货量并非…

【leetcode】225.用队列实现栈

分析&#xff1a; 队列遵循先入先出的原则&#xff0c;栈遵循后入先出的原则 也就是说&#xff0c;使用队列实现栈时&#xff0c;入队操作正常&#xff0c;但是出队要模拟出栈的操作&#xff0c;我们需要访问的是队尾的元素&#xff1b;题目允许使用两个队列&#xff0c;我们可…

ardupilot开发 --- 位置控制篇

几个疑问 如何根据GPS定位信息进行位置控制&#xff1f; 经纬度海拔高度如何转成导航坐标系&#xff1f; 飞控中的航迹点waypoint是基于那个坐标系的点&#xff1f;导航坐标系&#xff1f; Home点&#xff1f;导航坐标系的原点&#xff1f;电机解锁时的点&#xff1f;xyz&…

JTS多边形自相交异常问题处理

遇到一个奇怪的问题&#xff0c;线上某户型导入报了个异常com.vividsolutions.jts.geom.TopologyException: found non-noded intersection between LINESTRING。 看日志定位问题出在计算两柜体是否相交的方法上 Point middlePoint AlgorithmUtils.middlePoint(sp,ep); Poin…

thinkphp6前后端验证码分离以及验证

1.验证码接口生成验证码: public function verify(){return captcha(); } 也可以自己写方法 2.验证方法和普通模式session验证有区别,需要改原文件: 修改后的代码: <?php // +---------------------------------------------------------------------- // | ThinkP…

360浏览器打开CSDN多个写文章窗口(文章编辑窗口、文章编辑标签)时,文章内容消失问题解决办法(取消勾选“阻止不同源页面共享Cookie”)

文章目录 快速解决办法解决360浏览器打开CSDN多个写文章窗口时&#xff0c;文章内容消失问题的策略目录问题描述理解CookiesCookie和同源策略的关联阻止不同源页面共享Cookie的影响解决策略总结 快速解决办法 点击浏览器设置&#xff1a; 点击高级设置–>网页内容高级设置…

【算法】双指针划分思想妙解移动零

Problem: 283. 移动零 文章目录 思路算法图解分析复杂度Code 思路 首先我们来讲一下本题的思路 本题主要可以归到【数组划分/数组分块】这一类的题型。我们将一个数组中的所有元素划分为两段区间&#xff0c;左侧是非零元素&#xff0c;右侧是零元素 那解决这一类的题我们首先想…

气象知识丨自动气象站的基本信息介绍

自动气象站的基本概述&#xff1a;自动气象站可以用于对大气温度、相对湿度、风向、风速、雨量、气压、太阳辐射、土壤温度、土壤湿度、能见度等众多气象要素进行全天候现场监测&#xff0c;具有气象信息服务功能&#xff0c;可以通过多种通讯方法与监控平台进行通讯&#xff0…

PyTorch学习笔记(十四)——网络模型的保存与读取

两种方式保存和加载模型 方式一 保存模型 不仅保存了网络模型的结构&#xff0c;也保存了网络模型的参数 import torch import torchvisionvgg16 torchvision.models.vgg16(weightsFalse) torch.save(vgg16,"vgg16_method1.pth") 加载模型 打印出的是网络模型的…

C++新经典05--文件操作

文件简介 文件在程序设计中是一个比较重要的概念&#xff0c;这里所说的文件&#xff0c;是指保存在硬盘、U盘等存储介质上的数据&#xff0c;这些存储介质&#xff08;简称磁盘&#xff09;上的数据就是以一个个文件的形式体现&#xff0c;每一个文件有一个对应的名字&#x…

描述性统计:集中趋势和分散

一、说明 在本文中&#xff0c;我们将深入研究描述性统计领域&#xff0c;探索其不同方面&#xff0c;包括统计类型、总体与样本、参数与统计、数据类型以及集中趋势和离散的度量。 让我幽默地向您介绍统计数据。 “统计数据就像比基尼。他们揭示的东西是暗示性的&#xff0c;但…

API开放!将语聚AI智能助手接入到您的自有系统中

概述 语聚AI基于集简云强大的应用软件“连接器”能力&#xff0c;提供了工具延展、知识延展、模型延展和嵌入集成等一系列功能&#xff0c;为用户带来了更加强大和智能的AI新体验。 我们深知&#xff0c;每家企业对于AI应用都有自己独特的需求和应用场景&#xff0c;只有通过开…

接口测试之Postman 安装与使用

Postman 安装 官网下载地址 www.postman.com/downloads Postman 使用 发送get请求 新建请求 填写请求方式&#xff1a;GET 填写请求 URL&#xff1a; ceshiren.com/ httpbin.ceshiren.com/get 填写请求参数&#xff1a; para_key para_value 发送 POST 请求 请求方式&a…