首页 > 编程语言 >带你详细刨析JavaScript 对象数组的深浅拷贝

带你详细刨析JavaScript 对象数组的深浅拷贝

时间:2023-07-27 11:46:45浏览次数:43  
标签:console log 刨析 JavaScript 数据类型 拷贝 o2 o1

深浅拷贝

●深浅拷贝指的是一种复制对象或者数组的行为
●也就是把一个对象或者数组中的数据完完整整的复制一份放到另一个数组或者对象中
●并且相互之间没有联系
●说道深浅拷贝这个我们不考虑基本数据类型
●因为基本数据类型没有引用地址一说
●说到复制这个事儿 有三个级别
○赋值
○浅拷贝
○深拷贝

赋值
●就是把一个变量存储的内容复制一份给另一个变量
●基本数据类型赋值以后两个变量之间没有关系
●修改任何一个的值都不会影响另一个
●复杂数据类型赋值以后,两个变量操作一个空间
●修改一个的值另一个也会跟着改变

// 赋值
// 基本数据类型
let num = 100
let num1 = num
console.log(num, num1);
num1 = 200
console.log(num, num1);
// 复杂数据类型
let o1 = { name: 'Jack', age: 25 }
let o2 = o1
console.log(o1, o2);
o2.name = 'Rose'
console.log(o1, o2);

浅拷贝

●说到浅拷贝就不考虑基本数据类型了
●就是按照原先的数据类型创建一个新的一样的数据类型
●把原始数据中的每一个数据依次赋值到新的数据类型中
●通过分析我们发现浅拷贝只能拷贝一层
●并且是简单数据类型 如果有第二层甚至多层就不能实现完完整整的复制

// 浅拷贝
// 准备原始数据
const o1 = {
    name: 'Jack',
    age: 25,
    color: {
        red: '红色',
        blue: '蓝色'
    }
}
// 实现拷贝
// 首先创建一个新的数据
const o2 = {}
// 遍历循环原始数据类型
for (let k in o1) {
    // 接下来就是把原始数据类型中的数据赋值到新创建的数据类型中
    // 如果这个时候元素对象中还复杂数据类型
    // 同样是赋值 依然不能实现完完整整的复制
    o2[k] = o1[k]
}
console.log(o1, o2);
// 修改o1中的值
o1.color.red = '红颜色'
console.log(o1, o2);

深拷贝

●就是要百分百的拷贝一份原始数据
●修改任何里面的数据都不会影响另一个里面的数据
●不管层级有多深 都能完整的复制过来 两个之间没有关系
●这就要通过深拷贝
●深拷贝的核心:递归

// 准备数据
const o1 = {
    name: 'Jack',
    age: 18,
    info: {
        height: 180,
        weight: 180,
        desc: {
            message: '今天天气很好'
        }
    },
    address: {
        city: '北京'
    },
    hobby: ['吃饭', '睡觉']
}
// 准备一个空对象
const o2 = {}
// 要实现深拷贝 我们就准备一个函数
function deepCopy(o2, o1) {
    // 首先我们还是要通过循环遍历的方式拿到原始数据类型中的数据
    for (let k in o1) {
        // 因为我们不知道里面都有什么数据所以我们要先判断
        if (Object.prototype.toString.call(o1[k]) === '[object Object]') {
            // 代码能进入到这里说明是一个对象
            o2[k] = {}
            // 再次进行拷贝 这个过程和我们刚做的是不是一样
            // 那我就直接调用我们的deepCopy函数就好
            deepCopy(o2[k], o1[k])
        } else if (Object.prototype.toString.call(o1[k]) === '[object Array]') {
            // 代码能执行到这里说明是一个数组
            o2[k] = []
            // 继续执行我们的拷贝函数
            deepCopy(o2[k], o1[k])
        } else {
            o2[k] = o1[k]
        }
    }
}
// 使用
deepCopy(o2, o1)
console.log(o1, o2);
o1.info.height = 300
console.log(o1, o2);

标签:console,log,刨析,JavaScript,数据类型,拷贝,o2,o1
From: https://www.cnblogs.com/qian-fen/p/17584546.html

相关文章

  • JavaScript数据类型
    JavaScript数据类型分类数据类型就是指的就是字面的的类型JavaScript数据类型(共六种)基本数据类型字符串型(String)数值型(Number)布尔型(Boolean)undefined型(Undefined)null型(Null)引用数据类型:Object所有new出来的对象用[]声明的数组用{}声明的对象String......
  • JavaScript命令模式:优雅地管理代码
    JavaScript命令模式在JavaScript中,命令模式是一种行为设计模式,它允许我们将请求封装为一个对象,从而使我们能够将请求的不同参数、方法和对象进行参数化。这种模式的主要目的是将请求的发送者和接收者解耦,从而使代码更加灵活和可维护。命令模式的实现在JavaScript中,我们可以使用......
  • dd命令:复制(拷贝)文件,并对原文件进行转换
    dd,是devicedriver的缩写,它可以称得上是“Linux世界中的搬运工”,它用来读取设备、文件中的内容,并原封不动地复制到指定位置。当我们用dd命令读取/dev/null文件时,就可以创造出空洞文件,而如果你的磁盘足够大,你甚至可以创造出一个宇宙黑洞呢!备份磁盘并恢复好记性不如烂笔头......
  • 手搓深拷贝
    手搓深拷贝constobj={name:"tom",age:19,hobby:["篮球","排球"],sayhi(){console.log("sayhi");},info:{name:'jerry',age:20}};consto={};//在写Object和Array的判断条件时,数组必须写在对象的前......
  • JavaScript学习 -- Base64编码
    Base64编码是一种常用的将二进制数据转换为文本数据的方式。在JavaScript中,我们可以通过使用Base64编码算法,将二进制数据转换为可读的文本数据,以便于在网络传输、文件传输等场景下使用。在本篇博客中,我们将介绍Base64编码的基本原理和相关技术,并提供一些实例来演示如何在JavaScript......
  • 传统IO过程以及零拷贝简单介绍
    传统IO过程整个IO过程涉及到三个部分,分别是用户缓冲区,内核缓冲区(PageCache)以及硬件。用户态CPU发起IO请求,即发起read()系统调用,随后进程阻塞,用户态切换到内核态。内核态DMA发起IO请求与硬件进行DMA拷贝到内核缓冲区中,之后内核缓冲区与用户缓冲区进行CPU拷贝,至此read()函数调用......
  • 《安富莱嵌入式周报》第318期:无线电扫描仪,高精度功耗分析仪,单片机JavaScript引擎,平头
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 【实战技能视频】基于硬件垂直消隐的多缓冲技术在LVGL,emWin,GUIX和TouchGFX应用https://www.armbbs.cn/forum.php?mod=viewthread&tid=120114视频版:https://www.bilibili.......
  • [爬虫]2.2.2 使用PhantomJS处理JavaScript
    PhantomJS是一个无头(headless)浏览器,它可以解析和执行JavaScript,非常适合用于爬取动态网页。"无头"意味着它可以在没有用户界面的情况下运行,这对于服务器环境和自动化任务非常有用。安装PhantomJS首先,你需要下载并安装PhantomJS。你可以从官方网站下载↗适合你的操作系统的版本......
  • 03_JavaScript
    一.JavaScript概述1.简介JavaScript一种解释性脚本语言,是一种动态类型、弱类型、基于原型继承的语言,内置支持类型。它的解释器被称为JavaScript引擎,作为浏览器的一部分,广泛用于客户端的脚本语言,用来给HTML网页增加动态功能。脚本语言是为了缩短传统的编写-编译-链接-运行(edit-......
  • javascript中的arguments
    在JavaScript中,arguments 是在每个函数中自动可用的特殊变量。它们表示调用函数时传递给函数的值。术语“arguments ”既指传递到函数中的实际值,也指用于在函数内访问这些值的机制。 JavaScript函数可以接受任意数量的参数,这意味着调用函数时可以传递零个、一个、两个或......