JavaScript 深克隆和浅克隆

news/2024/7/5 6:15:27

概念

浅克隆:

 直接将存储在栈中的值赋值给对应的变量;如果是基本类型则直接赋值给对应的值;如果是引用类型则赋值的是地址;

深克隆:

就是直接把值赋值给对应的变量,从而产生一个与数据源不同的新数据(数据地址已发生变化),深拷贝就是拷贝各个层级的属性。

 

浅克隆(=)

   1、直接用=进行赋值。如,a=b

   2、缺点就是 如果a和b 不是基本类型  那么改变a的时候b也会跟着改变

let arr1 = [1, 2, 3, 4];
let arr2 = arr1;
console.log( arr2 );  // [10, 2, 3, 4]
arr1[0] = 10;
console.log( arr2 );  // [10, 2, 3, 4]

// 在这段代码中,把arr1赋值给arr2,当arr1的值改变时,arr2对应的值也会改变

深克隆

1.  递归法

// 实现深拷贝
function deepClone( obj )
{
    // 根据array或者json类型,初始化
    let objClone = Array.isArray(obj) ? [] : {};

    // 当前object不是null,并且可以是任意object类型
    if( obj && typeof obj === "object")
    {
        // 循环obj中所有的键
        // 【array的话,则键是index】
        for(key in obj)
        {
            // 确定obj中包含当前键
            if(obj.hasOwnProperty(key))
            {
                // 当前项key:不是null,也不是初始类型,递归
                if(obj[key] && typeof obj[key] === "object")
                {
                    objClone[key] = deepClone(obj[key]);
                }
                // key:初始类型,则直接复制
                else
                {
                    objClone[key] = obj[key];
                }
            }
        }
    }
    return objClone;
}  

2、JSON.stringify 和 JSON.parse

function deepClone( obj )
{
    let result = JSON.parse(JSON.stringify(obj))
    return result
} 

3、jQuery $.extend

let a=[0,1,[2,3],4],

// true: 深拷贝
// false: 浅拷贝
let b=$.extend(true,[],a);

 

转自:https://www.wolai.com/mary/qH1g6wb4C9EvSZCFFDmpVz

 

 


http://www.niftyadmin.cn/n/3655778.html

相关文章

FTP数据上传及WinCE系统FTP根目录设定

嵌入式系统难免要和上位机PC进行数据交换,小数据用TCP/IP实现就可以了,大文件,动则几百兆的数据,用Tcp/Ip自己实现有点划不来,所以我一般采用了Ftp上传的功能,在嵌入式组态软件的下载功能中就实现了组态的F…

JavaScript 垃圾回收机制

JavaScript拥有自动的垃圾回收机制,当一个值,在内存中失去引用时,垃圾回收机制会根据特殊的算法找到它,并将其回收,释放内存。 一 、垃圾回收概念 在有些数据不被需要的时候,这些数据就是垃圾数据&#x…

.Net 平台SerialPort类内部实现探秘

这段时间用Moxa DA660(WinCE5.0平台)测试16口同时下发数据,发现由于该硬件设备的CPU主频仅有260M赫兹,大于10口同时下发数据就会造成发送延迟,导致下发失败。前次用.net的SerialPort类实现了一个PPC红外口读写数据的小…

javaScript 内存泄露

什么是内存泄露 只要程序提出要求 ,运行时就需要提供内存 如果是持续性的服务进程,如果不及时释放不需要的内存,就会影响系统新能,甚至直接会崩溃。 不及时释放的内存 就叫内存泄露 什么情况下会引起? 1、意外的…

CSDN技术大会场记

1、和太阳一起出发2、远观大运村外景3、北京丽亭华苑酒店(CSDN技术大会场地)4、热闹的CSDN技术大会会场真正的CSDN英雄们 -- 名人堂,MVP,MVB这里面最早见过面的是孟宪会,是在我初次当选MVP在微软第一次聚会时认识的&am…

CSDN技术大会

其实在上周就收到了csdn相关人员的参会确认电话,今天早上查收邮件没有收到相关信息,没想到来了一个电话,提醒别忘了周五参会,她说补发邮件已不大可能,可以带名片过去,那边有名单可确认。也好,只…

JavaScript 作用域链

作用域链是什么 函数在使用一个变量的时候,会查找这个变量,如果自己内部没有,就会向上找,这个查找的过程就叫 作用域链 普通函数的作用域链 1、创建一个函数fn()时,会创建一个包含全局变量的作用域链,保存…

2007微软MVP获得连任

今天早上收到了这封邮件:“[MVP] 热烈祝贺!您已经获得 Microsoft MVP 奖励”,心情还是满不错的,在blog上留个纪念。----------------------------------------------------------------------------------------------尊敬的 Hong…