JavaScript深拷贝

本文通过实例对比浅拷贝与深拷贝的区别,详细解析了深拷贝的实现原理及其实现方式,帮助读者理解如何避免对象引用带来的问题。

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

偶尔在今日头条看到一篇关于JavaScript深拷贝的文章(感谢原作者:外卖杂谈(头条号)),备忘一下

浅拷贝代码:

 

 1 //浅拷贝
 2     var temp_1 = {name: 'Liang', age: '21',
 3         wife:{
 4             name:"hello",
 5             author:"world"
 6         },
 7         hobby: ['baskeball', 'coding', 'eating', 'sleeping']};
 8     var temp_2 = {};
 9     for (var k in temp_1) {
10         temp_2[k] = temp_1[k];
11     }
12     console.log("push之前");
13     console.log(temp_1);
14     temp_2["hobby"].push("laughing");
15     console.log("push之后");
16     console.log(temp_2);
17     console.log(temp_1);

 

浏览器输出结果

注意Array的变化。原因:在复制属性值为Object的时候只是进行了简单的地址拷贝

深拷贝:

 

 1 var temp_1 = {
 2         name: 'Liang', age: '21',
 3         wife: {
 4             name: "hello",
 5             author: "world"
 6         },
 7         hobby: ['baskeball', 'coding', 'eating', 'sleeping']
 8     };
 9     var temp_2 = {};
10     /**
11      *深层拷贝
12      * @param obj1 新对象
13      * @param obj2 被拷贝对象
14      */
15     function myCopy(obj1, obj2) {
16         obj1 = obj1 || {};
17         for (var temp in obj2) {
18             if (obj2.hasOwnProperty(temp)) {//hasOwnProperty(x)    指示对象是否具有指定名称的属性
19                 if (typeof obj2[temp] == 'object') {//属性值为object
20                     obj1[temp] = Array.isArray(obj2[temp]) ? [] : {};//确定属性类型
21                     myCopy(obj1[temp], obj2[temp]);//递归进行处理
22                 } else {
23                     obj1[temp] = obj2[temp]
24                 }
25             }
26         }
27     }
28     myCopy(temp_2,temp_1);
29     console.log("push之前");
30     console.log(temp_1);
31     temp_2["hobby"].push("laughing");
32     console.log("push之后");
33     console.log(temp_2);
34     console.log(temp_1);

运行结果:

代码不难理解,问题主要来自复制对象时候,浅拷贝直接使用了地址引用,导致复制前后两个对象变量含有共享内容,而深拷贝中 obj1[temp] = Array.isArray(obj2[temp]) ? [] : {}; 这行代码重新创建新的变量,so...

如有不正确的地方,麻烦大神指正一下,谢谢!!!

 

转载于:https://www.cnblogs.com/liangqinghai/p/6441992.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值