JavaScript 中的对象深度复制(Object Deep Clone)

 

JavaScript中并没有直接提供对象复制(Object Clone)的方法。

JavaScript中的赋值,其实并不是复制对象,而是类似`c/c++`中的引用(或指针),因此下面的代码中改变对象b中的元素的时候,也就改变了对象a中的元素。

a = {k1:1, k2:2, k3:3};
b = a;
b.k2 = 4;

 

如果只想改变b而保持a不变,就需要对对象a进行复制。

用jQuery进行对象复制

在可以使用jQuery的情况下,jQuery自带的extend方法可以用来实现对象的复制。

a = {k1:1, k2:2, k3:3};
b = {};
$.extend(b,a);

 

自定义clone()方法来实现对象复制

1.下面的方法,是给Object的原型(prototype)添加深度复制方法(deep clone)。

 

复制代码
 1 Object.prototype.clone = function() {
 2     // Handle null or undefined or function
 3     if (null == this || "object" != typeof this)
 4         return this;
 5     // Handle the 3 simple types, Number and String and Boolean
 6     if(this instanceof Number || this instanceof String || this instanceof Boolean)
 7         return this.valueOf();
 8     // Handle Date
 9     if (this instanceof Date) {
10         var copy = new Date();
11         copy.setTime(this.getTime());
12         return copy;
13     }
14     // Handle Array or Object
15     if (this instanceof Object || this instanceof Array) {
16         var copy = (this instanceof Array)?[]:{};
17         for (var attr in this) {
18             if (this.hasOwnProperty(attr))
19                 copy[attr] = this[attr]?this[attr].clone():this[attr];
20         }
21         return copy;
22     }
23     throw new Error("Unable to clone obj! Its type isn't supported.");
24 }
复制代码

 

所有对象可以直接使用`.clone()`

var a=[1,2,true,null,"fdsfdsa",[1,"fdsa",{"a":1,"b":["fd",3,{"b":"3","c":""},new Date()],"c":new Date(),"d":false,"e":null}]];
var b=a.clone();

2.使用额外的工具函数实现,适用于大部分对象的深度复制(Deep Clone)。

 

复制代码
 1 function clone(obj) {
 2     // Handle the 3 simple types, and null or undefined or function
 3     if (null == obj || "object" != typeof obj) return obj;
 4 
 5     // Handle Date
 6     if (obj instanceof Date) {
 7         var copy = new Date();
 8         copy.setTime(obj.getTime());
 9         return copy;
10     }
11     // Handle Array or Object
12     if (obj instanceof Array | obj instanceof Object) {
13         var copy = (obj instanceof Array)?[]:{};
14         for (var attr in obj) {
15             if (obj.hasOwnProperty(attr))
16               copy[attr] = clone(obj[attr]);
17         }
18         return copy;
19     }
20     throw new Error("Unable to clone obj! Its type isn't supported.");
21 }
复制代码

 

用法类似:

var a=[1,2,true,null,"fdsfdsa",[1,"fdsa",{"a":1,"b":["fd",3,{"b":"3","c":""},new Date()],"c":new Date(),"d":false,"e":null}]];
var b=clone(a);

 

测试

用上面两种方法都可以得到同样的结果。
至于用哪个怎么用,取决于你的喜好/习惯了 :)     就本人来说,我更倾向于使用原型的方法啦,方便嘛,啊哈哈哈~
你想测试结果的话,直接复制代码运行:

复制代码
 1 var a=[1,2,true,null,"fdsfdsa",[1,"fdsa",{"a":1,"b":["fd",3,undefined,{"b":"3","c":""},new Date()],"c":new Date(),"d":false,"e":null,"f":function(){return 2;}}],function(){}];
 2 console.log("a=",a);
 3 console.log("b=a.clone();");
 4 b=a.clone();
 5 console.log("JSON.stringify(a)==JSON.stringify(b) = ",JSON.stringify(a)==JSON.stringify(b));
 6 console.log("JSON.stringify(a)===JSON.stringify(b) = ",JSON.stringify(a)===JSON.stringify(b));
 7 console.log("JSON.stringify(a) = ",JSON.stringify(a));
 8 console.log("JSON.stringify(b) = ",JSON.stringify(b));
 9 console.log("a[2]=123,b[2]=55555");
10 a[2]=123,b[2]=55555;
11 console.log("a=",a,"\t\t","b=",b);
12 
13 console.log("b=clone(a);");
14 b=clone(a);
15 console.log("JSON.stringify(a)==JSON.stringify(b) = ",JSON.stringify(a)==JSON.stringify(b));
16 console.log("JSON.stringify(a)===JSON.stringify(b) = ",JSON.stringify(a)===JSON.stringify(b));
17 console.log("JSON.stringify(a) = ",JSON.stringify(a));
18 console.log("JSON.stringify(b) = ",JSON.stringify(b));
19 console.log("a[2]=1234,b[2]=33333");
20 a[2]=1234,b[2]=33333;
21 console.log("a=",a,"\t\t","b=",b);
复制代码

 

可以看到, 输出结果 `a` 和 `b` 是相等的,但是 改变 `a` 的元素的值, 并不会影响到 `b` 的元素。

访问Github,get更多技能:https://github.com/lzpong/H5_JS_Tools

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。 原文链接:https://www.cnblogs.com/lzpong/p/6973003.html
posted @   _Ong  阅读(11448)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示