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

news2024/9/27 21:18:34

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

变量直接赋值

赋值 就是一个=,比如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.coloradmin.cn/o/1517112.html

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

相关文章

公派访问学者申请被拒签的原因有哪些?

在申请公派访问学者时&#xff0c;拒签是一种常见的结果&#xff0c;其原因多种多样。首先&#xff0c;申请材料不完整或者不符合要求可能是导致拒签的主要原因之一。例如&#xff0c;个人简历、研究计划书、推荐信等材料未能清晰地展示申请人的学术背景和研究意图&#xff0c;…

想零基础转行Python开发,怎么学习呢?

转行零基础学Python编程开发难度大吗&#xff1f;从哪学起&#xff1f;近期很多小伙伴问我&#xff0c;如果自己转行学习Python&#xff0c;完全0基础能否学会呢&#xff1f;Python的难度到底有多大&#xff1f;今天&#xff0c;小编就来为大家详细解读一下这个问题。 学习 Py…

蓝桥杯刷题|02入门真题

[蓝桥杯 2022 省 B] 刷题统计 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目&#xff0c;周六和周日每天做 b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 n 题? 输入格式 输入一行包含三个整数…

用这个工具制作企业宣传册,效果也太酷了

​随着市场的竞争日益激烈&#xff0c;企业的宣传册成为了展示企业形象和实力的重要途径。而如何制作一份既美观又实用的宣传册&#xff0c;成为了许多企业家和设计师们关注的焦点。 今天&#xff0c;笔者要向大家介绍的就是这样一款工具&#xff0c;它能够让用户轻松制作出既具…

软件测试中的AI-为什么它在软件自动化测试中很重要?

通俗地说&#xff0c;人工智能&#xff08;AI&#xff09;是计算机科学的一个领域&#xff0c;它专注于使机器“智能化”。所谓智能&#xff0c;就是使系统能够像人类一样学习和做出决策。因此&#xff0c;人工智能机器将能够学习如何在特定情况下做出反应&#xff0c;然后根据…

基于springboot社团管理系统的设计与实现

互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#xff0c;劳…

使用vscode+clangd+bear+publickeyssh远程开发Linux程序

目录 配置ssh密钥远程登录登录远程Linux主机安装必要软件安装vscode插件1.安装remote-ssh插件2.通过vscode远程连接到linux机器3.在远程安装插件clangd4.关闭C/C Intellense engine 使用vscodeclangdbear1.修改Makefile2.编译内核3.结果 配置ssh密钥远程登录 一定要配置成密钥…

Nacos安装遇到的问题

Windows安装nacos双击startup.cmd执行出错 改成用cmd窗口输入命令 startup.cmd -m standalone启动之后登录的问题 权限认证失败 没有 命名空间的访问权限&#xff01; 把默认的登录url改成&#xff1a; http://127.0.0.1:8848/nacos/#/login登录之后&#xff0c;点击导入配置…

基于springboot实现驾校信息管理系统项目【项目源码+论文说明】

基于springboot实现驾校信息管理系统演示 摘要 随着人们生活水平的不断提高&#xff0c;出行方式多样化&#xff0c;也以私家车为主&#xff0c;那么既然私家车的需求不断增长&#xff0c;那么基于驾校的考核管理也就不断增强&#xff0c;那么业务系统也就慢慢的随之加大。信息…

用python证明一生一世很容易,但要爱一个人一生一世就比较难了

个人简介 &#x1f468;&#x1f3fb;‍&#x1f4bb;个人主页&#xff1a;九黎aj &#x1f3c3;&#x1f3fb;‍♂️幸福源自奋斗,平凡造就不凡 &#x1f31f;如果文章对你有用&#xff0c;麻烦关注点赞收藏走一波&#xff0c;感谢支持&#xff01; &#x1f331;欢迎订阅我的…

halconOCR文字识别

1、OCR文字识别 FontFile : Universal_0-9_NoRej dev_update_window (off) read_image (bottle, bottle2) get_image_size (bottle, Width, Height) dev_open_window (0, 0, Width, Height, black, WindowHandle) set_display_font (WindowHandle, 16, mono, true, false) dev…

JS-06-数组

一、数组的创建与访问 见&#xff1a;JS-04-javaScript数据类型和变量 JavaScript的Array可以包含任意数据类型&#xff0c;并通过索引来访问每个元素。 要取得Array的长度&#xff0c;直接访问length属性&#xff1a; let arr [1, 2, 3.14, Hello, null, true]; console.l…

单头注意力机制(ScaledDotProductAttention) python实现

输入是query和 key-value&#xff0c;注意力机制首先计算query与每个key的关联性&#xff08;compatibility&#xff09;&#xff0c;每个关联性作为每个value的权重&#xff08;weight&#xff09;&#xff0c;各个权重与value的乘积相加得到输出。 import torch import tor…

AS-V1000 视频监控平台产品介绍:web客户端功能介绍(上)

目 录 一、引言 1.1 AS-V1000视频监控平台介绍 1.2 平台服务器配置说明 二、软件概述 2.1 软件用途 2.2 登陆界面 2.3 主界面 2.4 视频浏览 三、web端主要功能介绍 3.1 多画面风格 3.1.1风格切换 3.1.2 切换效果 3.2截屏 3.2.1 单画面截屏 3.2.2 …

【当前全网最详细】WebUI中使用Instant_ID来控制生成对象面部的用法

&#x1f388;为什么有这篇文章 中文网络上或者B站很多UP&#xff0c;在讲述WebUI中使用这个controlnet来换脸的时候&#xff0c;要么讲的过于复杂&#xff0c;要么就是没有讲清楚&#xff0c;所以这里整理下详细的使用方法&#xff0c;并记录下生成的内容。 如果懒得看文字可…

微信小程序-day01

文章目录 前言微信小程序介绍 一、为什么要学习微信小程序?二、微信小程序的历史创建开发环境1.注册账号2.获取APPID 三、下载微信开发者工具1.创建微信小程序项目2.填写相关信息3.项目创建成功 四、小程序目录结构项目的主体组成结构 总结 前言 微信小程序介绍 微信小程序&…

visa卡支持美区苹果Apple id绑定

苹果手机我相信大家都很熟悉&#xff0c;所以很多小伙伴都需要绑定卡来进行一系列的体验&#xff0c;这里我使用的是559666 在绑定之前我们需要先开一张visa卡&#xff0c;点击获取 开卡步骤如下&#xff0c;按图片步骤即可开卡 卡片信息在卡中心cvc安全码里面

STM32F407_外部中断

这里写目录标题 前言1、EXTI概述2、外部中断配置流程完整代码 前言 注释很详细&#xff0c;放心食用。 1、EXTI概述 STM32F4的每个IO都可以作为外部中断的中断输入口&#xff0c;这点也是STM32F4的强大之处。STM32F407的中断控制器支持22个外部中断/事件请求。每个中断线上都设…

hex文件格式解析

本文框架 1. hex文件格式1.1 数据长度1.2 地址域1.3 数据类型1.4 数据域1.5 CRC校验域 本文对hex文件格式进行解析&#xff0c;介绍各部分组成及其含义&#xff0c;在此mark下&#xff0c;方便后续开发脚本对hex文件进行操作。 1. hex文件格式 Intel HEX文件是由一行行符合Int…

Explain详解与索引优化最佳实践

Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在select语句之前增加explain关键字,MySQL会在查询前设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL 注意: 如果from中包含子查询,仍会执行该子查询,将结果…