javaScript中的深浅拷贝

本文深入探讨了浅拷贝与深拷贝的区别,通过JavaScript实例展示了两种拷贝方式的具体实现。浅拷贝仅复制引用类型的表面层,而深拷贝则递归复制所有层级,包括内部的对象和数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浅拷贝/克隆只是对指针进行拷贝,拷贝前后的指针依旧指向同一个内存空间;

深拷贝/克隆不仅会对指针进行拷贝,还会对指针所指向的空间内容进行拷贝。

let obj1 = {a:100,b:[1,2,3,],c:{x:10},d:new RegExp()}
console.log(obj1);  //{ a: 100, b: [ 1, 2, 3 ], c: { x: 10 }, d: /(?:)/ }

😂浅拷贝的实现

  • 方法1:
let obj2 = {...obj1}
console.log(obj1==obj2);   //false
console.log(obj1.c==obj2.c);   //true
  • 方法2:
let obj2 = new obj1.constructor();  //保持继承链
for (var key in obj1) {
    if (obj1.hasOwnProperty(key)){
        obj2[key] = obj1[key]
    } 
}
console.log(obj1==obj2);   //false
console.log(obj1.c==obj2.c);   //true

😂深拷贝的实现

let obj2 = JSON.parse(JSON.stringify(obj1))
console.log(obj1==obj2);  //false
console.log(obj1.c==obj2.c);  //false
console.log(obj2.d);  // {}
console.log(obj1.d==obj2.d);  //false

显然,当对象当中有function和date类型的数据以及正则类型存在时,这种方法不适用于进行深拷贝。

const deepClone = function (obj1) {
    if(obj1 == null) return null
    if(typeof(obj1) != 'object') return obj1
    if(obj1 instanceof RegExp){
        return new RegExp()
    }   
    if(obj1 instanceof Date){
        return new Date()
    }   
    let newObj =  new obj1.constructor()
    for(let key in obj1){
        if(obj1.hasOwnProperty(key)){
            newObj[key] = deepClone(obj1[key])
        }
    }
    return newObj;
}
let  obj2 = deepClone(obj1)
console.log(obj1.c==obj2.c);  //false
console.log(obj2.d);  // /(?:)/
console.log(obj1.d==obj2.d);  //false
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

么心么肺

你的鼓励将是我学习的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值