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

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

变量直接赋值

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

  <script>
        let str = 'hello'
        let str2 = str //把str的值,赋值给str2.也就是str2='hello'
        console.log(str2)

        str = 'world'  //修改str的值为world
        console.log(str2)  //hello
        let obj1 = { name: 'zs', age: 20 }
        let obj2 = obj1   //把obj1的值(obj1在存储在栈中的地址)赋值给obj2
        console.log(obj2)
        obj1.age = 1000
        console.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,则直接返回1
    if(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 = 1234
        console.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 = 1234
        console.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.mfbz.cn/a/456680.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统Docker部署Plik系统结合内网穿透实现公网访问本地文件

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上传或者…

HarmonyOS NEXT应用开发之深色模式适配

介绍 本示例介绍在开发应用以适应深色模式时&#xff0c;对于深色和浅色模式的适配方案&#xff0c;采取了多种策略如下&#xff1a; 固定属性适配&#xff1a;对于部分组件的颜色属性&#xff0c;如背景色或字体颜色&#xff0c;若保持不变&#xff0c;可直接设定固定色值或…

企业微信如何接入第三方应用?

1.登录企业微信管理后台&#xff1a;https://work.weixin.qq.com/wework_admin​​​​​ 2.点击创建应用&#xff1b; ​​​​​​​ 3. 此时可以看到已经创建好的应用&#xff0c;并且生成应用的唯一id&#xff08;agentId&#xff09; 4. 第三方应用申请域名 (举例&…

通过OceanBase 3.x中not in无法走hash连接的变化,来看OB优化器的发展

作者简介&#xff1a; 张瑞远&#xff0c;曾从事银行、证券数仓设计、开发、优化类工作&#xff0c;现主要从事电信级IT系统及数据库的规划设计、架构设计、运维实施、运维服务、故障处理、性能优化等工作。 持有Orale OCM,MySQL OCP及国产代表数据库认证。 获得的专业技能与认…

卷径计算(膜厚叠加+数值积分器应用博途PLC SCL代码)

VN积分法卷径计算的其它方法,可以参考下面文章链接: 1、VN积分法卷径计算FB https://rxxw-control.blog.csdn.net/article/details/131612206https://rxxw-control.blog.csdn.net/article/details/1316122062、PLC数值积分器 https://rxxw-control.blog.csdn.net/article/…

【刷题训练】LeetCode:557. 反转字符串中的单词 III

557. 反转字符串中的单词 III 题目要求 示例 1&#xff1a; 输入&#xff1a;s “Let’s take LeetCode contest” 输出&#xff1a;“s’teL ekat edoCteeL tsetnoc” 示例 2: 输入&#xff1a; s “Mr Ding” 输出&#xff1a;“rM gniD” 思路&#xff1a; 第一步&am…

Cassandra 集群安装部署

文章目录 一、概述1.官方文档2. 克隆服务器3.安装说明4.安装准备4.1.安装 JDK 114.2.安装 Python4.3.下载文件 二、安装部署1.配置 Cassandra2.启动 Cassandra3.关闭Cassandra4.查看状态5.客户端连接服务器6.服务运行脚本 开源中间件 # Cassandrahttps://iothub.org.cn/docs/m…

TikTok新手如何起号?环境因素与内容创新技巧

相信很多刚入行的TikTok玩家都遇到过一个难题&#xff0c;那就是账号权重低&#xff0c;播放量在个位数徘徊&#xff0c;其实都是因为还没起号&#xff01;那么具体如何起号呢&#xff1f;下面小编也给大家分享一下技巧。 一、如何起号 1、明确注册 TikTok 账号的目的 无论是…

嵌入式3-14

1、整理思维导图 2、重写链表的代码 3、实现链表&#xff0c;按值查找返回位置的功能&#xff0c;按位置查找返回值&#xff0c;释放单链表&#xff0c;链表逆置 node_p create_link_list()//创建头结点 { node_p p(node_p)malloc(sizeof(node)); if(pNULL) { …

python中的常用模块

os和sys模块 os和sys是Python标准库中两个非常重要的模块&#xff0c;它们提供了丰富的方法来与Python解释器以及操作系统交互。 os模块 os模块提供了许多函数&#xff0c;用于处理文件和目录等操作系统任务&#xff0c;如路径管理、执行命令、获取进程信息等。 常用方法&a…

计算机网络-第7章 网络安全(1)

主要内容&#xff1a;安全威胁与问题、对称密钥密码体制和公钥密码体制、数字签名与鉴别、网络层和运输层安全协议、应用层电子邮件、系统安全&#xff1a;防火墙与入侵检测 当网络中的用户都来自社会各个阶层和部门时&#xff0c;网络中存储和传输的数据需要保护。 7.1 网络安…

【python开发】并发编程(上)

并发编程&#xff08;上&#xff09; 一、进程和线程&#xff08;一&#xff09;多线程&#xff08;二&#xff09;多进程&#xff08;三&#xff09;GIL锁 二、多线程开发&#xff08;一&#xff09;t.start()&#xff08;二&#xff09;t.join()&#xff08;三&#xff09;t.…

深入了解栈和队列

小伙伴们&#xff0c;今天我们来继续学习数据结构的第二部分内容&#xff0c;就是栈和队列了。那么栈和队列有什么用呢&#xff1f; 栈和队列是两种重要的线性结构。从数据结构的角度看&#xff0c;栈和队列也是线性表&#xff0c;其特殊性在于栈和队列的基本操作是线性表操作…

Linux系统部署Swagger Editor结合内网穿透实现公网管理本地接口文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xf…

数据结构:图的存储与遍历(待续)

图&#xff08;Graph&#xff09;是一种较线性表和树更为复杂的非线性结构。在图结构中&#xff0c;对结点&#xff08;图中常称为顶点&#xff09;的前驱和后继个数不加限制&#xff0c; 即结点之间的关系是任意的。 一、基本概念和一般结论 因为一条边关联两个顶点&#xff0…

计算机服务器中了devos勒索病毒怎么解密,devos勒索病毒解密工具流程

随着网络技术的不断发展与更新&#xff0c;越来越多的企业利用网络开展了各项工作业务&#xff0c;网络也为企业提供了极大便利&#xff0c;大大提高了办公效率。但网络是一把双刃剑&#xff0c;企业的数据安全问题一直是企业关心的主要话题&#xff0c;近日&#xff0c;云天数…

如何在Windows搭建WebDav服务,并外网可访问

目录 1. 安装IIS必要WebDav组件 2. 客户端测试 3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网 3.1 打开Web-UI管理界面 3.2 创建隧道 3.3 查看在线隧道列表 4. 公网远程访问 4.1 浏览器访问测试 4.2 映射本地盘符访问 4.3 安装Raidrive客户端 总结&…

由世界第一个AI软件工程师Devin引发的热潮背后----程序员到底会不会被代替?AI发展至如今是否初衷已变?

目录 一.Devin的登场是突破也是导火索 二.Devin的"逆天"能力 1、端到端构建和部署程序 2、自主查找并修复bug 3、训练和微调自己的AI模型 4、修复开源库 5、成熟的生产库也能做贡献 6、学习能力 三.Devin的出现甚至整个AI领域的进步,编程还有未来吗? 1.业…

机试:蛇形矩阵

问题描述: 代码示例: //蛇形矩阵 #include <bits/stdc.h> using namespace std;int main(){int n;cout << "输入样例" << endl; cin >> n;int k 1; for(int i 0; i < n; i){if( i %2 0){//单数行for(int j 0; j < n; j){ cout &…

国际前十正规外汇实时行情走势app软件最新排名(综合版)

外汇交易&#xff0c;作为当今世界金融市场上一个重要的板块&#xff0c;备受关注和热议。随着金融市场的日益发展&#xff0c;外汇交易也发展成为一个新兴的投资交易渠道。为了更好地满足投资者对外汇市场的需求&#xff0c;外汇实时行情走势app软件应运而生&#xff0c;它为投…
最新文章