变量直接赋值、浅拷贝、深拷贝、递归、异常

对象拷贝(对象存在堆中)

变量直接赋值

赋值 就是一个=,比如let obj2=obj1 这就是赋值,只是把栈中存储的值,赋值给另一个变量
把obj1在栈中的地址,赋值给obj2

  <script>let str = 'hello'let str2 = str //把str的值,赋值给str2.也就是str2='hello'console.log(str2)str = 'world'  //修改str的值为worldconsole.log(str2)  //hellolet obj1 = { name: 'zs', age: 20 }let obj2 = obj1   //把obj1的值(obj1在存储在栈中的地址)赋值给obj2console.log(obj2)obj1.age = 1000console.log(obj2)</script>

在这里插入图片描述

浅拷贝

拷贝,就是把两个对象,完全的分开
目标:修改一个对象,另一个对象不受影响

 <script>let obj1 = { name: 'zs', age: 20 }let obj2 = {}  //写了这一行,表示obj1和obj2已将是两个不同的对象了// 循环遍历obj1,循环一次,取obj1里面的一个属性,然后给obj2加上for (let key in obj1) {// key是变量 取键对应的键值为obj1[k]obj2[key] = obj1[key]}obj1.name = 'lisi'console.log(obj1)console.log(obj2)</script>

在这里插入图片描述
对象中还有引用类型值的情况,当对象中的对象发生改变,浅拷贝还是会发生改变(只拷贝了对象的第一层)

     let obj1 = { name: 'zs', age: 20, msg: { xex: '男' } }let obj2 = {}  //写了这一行,表示obj1和obj2已将是两个不同的对象了// 循环遍历obj1,循环一次,取obj1里面的一个属性,然后给obj2加上for (let key in obj1) {// key是变量 取键对应的键值为obj1[k]obj2[key] = obj1[key]}// obj1的msg又是一个对象,里面保存的还是对象地址obj1.msg.sex = '女'console.log(obj1.msg.sex)console.log(obj2.msg.sex)

在这里插入图片描述

递归

计算一个数的阶乘
    <script>
// 计算一个数的阶乘
// 5的阶乘=5*4*3*2*1
// 写递归第一步,先找规律
// 规律:n的阶乘=n*(n-1)的阶乘
// 写递归的第二步:明确函数的功能
// 接下来。写一个函数,函数的功能是计算一个数的阶乘(当我需要计算一个数的阶乘的时候,就调用这个函数)function fn(n)
{// 如果n是1,则直接返回1if(n===1) return 1// return n的阶乘// return n*(n-1)的阶乘   计算一个数的阶乘的时候就调用这个函数,则n-1的阶乘为fn(n-1)return n*fn(n-1)
}</script>

深拷贝

深拷贝,通过递归,逐层将对象的属性、属性值拷贝给另一个对象,使得两个对象能够完全分开

   <script>let obj1 = {name: 'zs',age: 20,info: ['男', 180, 70],dog: {name: 'wangcai',color: 'black',child: {name: '小旺财',age: 2,color: '花'}}}let obj2 = {}// 前提:// 1.准备好需要拷贝的对象、或者数组// 2.准备好  一个空对象、或者空数组// 拷贝的时候:// 1.先判断拷贝的值是数组吗// 2.在判断拷贝的值是对象吗// 3.不是数组也不是对象,肯定是一个普通值,则直接拷贝// 写一个函数,可以实现浅拷贝,当我需要浅拷贝的时候,直接调用这个函数即可function fn(obj1, obj2) {for (let key in obj1) {// 循环的时候先判断,拷贝的值是数组还是对象if (Array.isArray(obj1[key])) //obj1[key]是数组吗{obj2[key] = []// 闲杂又需要obj1.info的值拷贝给obj2.info这个空数组,这又是一个浅拷贝,当我需要浅拷贝的时候,调用fn即可fn(obj1[key], obj2[key])}else if (obj1 instanceof Object) //obj1如果有构造函数Object就是对象{obj2[key] = {}fn(obj1[key], obj2[key])}else {// 如果进入else,说明对象的值是普通的值,则直接浅拷贝obj2[key] = obj1[key]}}}fn(obj1, obj2)obj1.dog.name = 1234console.log(obj1)console.log(obj2)</script>

在这里插入图片描述

小计

任何对象,原型链最顶层的对象对应的构造函数是Object
可以通过instance 判断该变量有没有构造函数Object来判断其是否是构造函数

其他拷贝方案

//上述使用for(let key in obj){}这样的语法实现的浅拷贝、深拷贝等等,讲解的主要目的是为了说明浅拷贝和深拷贝的概念
//实际工作中不会使用递归实现深拷贝
//其他拷贝方案:
//浅拷贝:(建议用)
Object.assign()------本意是实现对象的合并,但是可以用来实现浅拷贝let obj=Object.assign({},obj1)// 深拷贝(有缺陷,JSON中不能有函数,转成字符串时函数会丢失)(不建议用)let obj1 = {name: 'zs',age: 20,info: ['男', 180, 70],dog: {name: 'wangcai',color: 'black',child: {name: '小旺财',age: 2,color: '花'}}}// 通过JSON.stringfy将上述对象先转为字符串let obj2 = JSON.parse(JSON.stringify(obj1))obj1.name = 'lisi'obj1.dog.name = 1234console.log(obj1)console.log(obj2)

在这里插入图片描述

异常(知道语法就行)

throw抛出异常

   <script>function sum(x, y) {if (x === undefined || y === undefined) {// 如果符合这个条件,说明调用函数的时候,没有传递参数// 实际使用,经常用throw和new Error()配合// throw new Error('错误描述信息')throw new Error('参数不对')}return x + y}console.log(sum())</script>

在这里插入图片描述

try…catch语句

和if…else…差不多

try{
把你的代码全写到这里,
如果没有异常发生,则正常执行
如果有异常发生,则会把异常自动抛出
}catch(e){
e就是抛出的错误对象
e.message 是一个固定的属性,表示错误描述信息
}

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

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

相关文章

【2024-完整版】python爬虫 批量查询自己所有CSDN文章的质量分:附整个实现流程

【2024】批量查询CSDN文章质量分 写在最前面一、分析获取步骤二、获取文章列表1. 前期准备2. 获取文章的接口3. 接口测试&#xff08;更新重点&#xff09; 三、查询质量分1. 前期准备2. 获取文章的接口3. 接口测试 四、python代码实现1. 分步实现2. 批量获取文章信息3. 从exce…

Java推荐算法——特征加权推荐算法(以申请学校为例)

加权推荐算法 文章目录 加权推荐算法1.推荐算法的简单介绍2.加权推荐算法详细介绍3.代码实现4.总结 1.推荐算法的简单介绍 众所周知&#xff0c;推荐算法有很多种&#xff0c;例如&#xff1a; 1.加权推荐&#xff1a;分为简单的特征加权&#xff0c;以及复杂的混合加权。主要…

软件功能测试内容有哪些?湖南长沙软件测评公司分享

软件功能测试主要是验证软件应用程序的功能&#xff0c;且不管功能是否根据需求规范运行。是通过给出适当的输入值&#xff0c;确定输出并使用预期输出验证实际输出来测试每个功能。也可以看作“黑盒测试”&#xff0c;因为功能测试不用考虑程序内部结构和内部特性&#xff0c;…

【词云图绘制实战】——数据准备、清洗、多形式展示

文章目录 1 手动输入文本1.1 加载包1.2 分词处理1.2.1 普通分词方式1.2.2 hmm分词 1.2 词云图绘制1.2.1 wordcloud词云图1.2.2 wordcloud2词云图 2 读取文本数据2.1 读取文本数据2.2 分词处理2.3 词云图绘制2.3.1 wordcloud词云图2.3.2 wordcloud2词云图2.3.3 letterCloud词云图…

uniapp发行H5获取当前页面query

阅读uni的文档大致可得通过 onLoad与 onShow()的形参都能获取页面传递的参数&#xff0c;例如在开发时鼠标移动到方法上可以看到此方法的简短介绍 实际这里说的是打开当前页面的参数&#xff0c;在小程序端的时候测试并无问题&#xff0c;但是发行到H5时首页加载会造成参数获取…

SpringMVC10、拦截器

10、拦截器 10.1、概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。 过滤器与拦截器的区别&#xff1a;拦截器是AOP思想的具体应用。 过滤器 servlet规范中的一部分&…

快快快!阿里通义灵码限时福利100%中奖,快来领取你的盲盒礼品!

限时福利100%中奖&#xff0c;快来领取你的盲盒礼品&#xff01; 通义灵码的「体验灵码赢取百万 AI 盲盒」的活动正在火热进行中&#xff0c;参与活动后领取 AI 盲盒&#xff0c;还可以邀请更多好友参与&#xff0c;有机会赢取 iPhone15、机械键盘等大奖&#xff01; 点击参与…

案例分析:分库分表后,我的应用崩溃了

今天我们主要分析一个案例&#xff0c;那就是分库分表后&#xff0c;我的应用崩溃了。 前面介绍了一种由于数据库查询语句拼接问题&#xff0c;而引起的一类内存溢出。下面将详细介绍一下这个过程。 假设我们有一个用户表&#xff0c;想要通过用户名来查询某个用户&#xff0…

C goto 语句

C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。 注意&#xff1a;在任何编程语言中&#xff0c;都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪&#xff0c;使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语…

Python数据分析毕业设计选题30个及框架大全

当涉及到Python数据分析毕业设计选题时&#xff0c;以下是30个选题建议&#xff1a; 1. 分析社交媒体数据&#xff0c;预测用户行为模式。 2. 使用机器学习算法分析电影评分数据&#xff0c;预测电影票房。 3. 分析股票数据&#xff0c;预测股票的涨跌趋势。 4. 分析用户购…

Kubernetes弃用Dockershim,转向Containerd:影响及如何应对

Kubernetes1.24版本发布时&#xff0c;正式宣布弃用Dockershim&#xff0c;转向Containerd作为默认的容器运行环境。Kubernetes以CRI(Container Runtime Interface)容器运行时接口制定接入准则&#xff0c;用户可以使用Containerd、CRI-O、CRI- Dockerd及其他容器运行时作为Kub…

打破数据孤岛,TDengine 与 Tapdata 实现兼容性互认证

当前&#xff0c;传统行业正面临着数字化升级的紧迫需求&#xff0c;但海量时序数据的处理以及数据孤岛问题却日益突出。越来越多的传统企业选择引入时序数据库&#xff08;Time Series Database&#xff0c;TSDB&#xff09;升级数据架构&#xff0c;同时&#xff0c;为了克服…