JavaScript实现对象的深度克隆

代码实现如下:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>clone</title>
 6
 7     <script type="text/javascript">
 8     //对象深度克隆方法
 9
10
11     //给Object添加一个clone()方法,完成深度克隆对象。。。yeahhhhh!!!
12     Object.prototype.clone = function(obj) {
13
14         var o,i,j,k;
15
16         if(typeof(obj)!="object"||obj ===null)        //支持string、boolean、number等
17             return obj;
18
19         if(obj instanceof (Array)){                    //Array类型
20             o=[];
21             i=0;
22             j=obj.length;
23             for(;i<j;i++){
24                 if(typeof(obj[i])=="object"&&obj[i]!=null){
25                     o[i]=arguments.callee(obj[i]);            //arguments.callee() 调用函数本身,实现递归
26                 }else{
27                     o[i]=obj[i];
28                 }
29             }
30         }
31         else{                                //最后为Object类型
32             o={};
33             for(i in obj){
34                 if(typeof(obj[i])=="object"&&obj[i]!=null){
35                     o[i]=arguments.callee(obj[i]);
36                 }else{
37                     o[i]=obj[i];
38                 }
39             }
40         }
41         return o;
42     }
43
44
45     var obj1 = {
46         name:"Lee",
47         age:25,
48
49         //obj的son对象属性
50
51         son:{
52             sname:"john",
53             sage:8,
54             play:function  () {
55                 return this.sname+" can play basketball!";
56             },
57
58             //son 的dog 对象属性
59             dog:{
60                 dogName:"coco",
61                 run:function() {
62                     return "john's dog, "+this.dogName+" can run!";
63                 }
64             }
65         },
66         sing:function(){
67             return this.name+" can sing!";
68         },
69     };
70
71      alert(obj1.name);                 //Lee
72      alert(obj1.son.play());          //john can play basketball!
73      alert(obj1.son.dog.run());        //john's dog, coco can run!
74
75     //对象克隆测试:
76     var obj2 = clone(obj1);
77
78
79     alert(obj2.name);                 //Lee
80     alert(obj2.son.play());           //john can play basketball!
81     alert(obj2.son.dog.run());        //john's dog, coco can run!
82
83 </script>
84 </head>
85 <body>
86     <div></div>
87 </body>
88 </html>

同样地,String Boolean number和null 都可以被克隆

测试结果:

 1     var str = "abc";
 2     var num = 120;
 3     var boo = false;
 4     var nu = null;
 5     var ss = clone(str);
 6     var nn = clone(num);
 7     var bb = clone(boo);
 8     var nnn = clone(nu);
 9
10     alert(ss);       //abc
11     alert(nn);      //120
12     alert(bb);      //false
13     alert(nnn);     //null

注意点:typeof() 对Array和Object类型 都返回Object  所以这里最好用instanceof

  typeof 是判断一个值是什么类型:typeof x    结果为number,boolean,string,function,object,undefined,注意:null是Object,因为null是一个特别的空对象。

  instanceof 是判断一个值是不是对象的实例:x instanceof obj  因为Array instanceof Object为true,就是说数组是对象的实例,所以具体的数组既是Array的实例,又是Object的实例,不过用于区分一个值是数组还是对象就很方便了,因为typeof 数组是Object,但是数组 instanceof Array 是true,如此,就很好的把数组从对象中分离开了。 

相关测试:

 1    var str = "abc";
 2     var num = 120;
 3     var boo = false;
 4     var nu = null;
 5
 6    alert(typeof str);    //string
 7     alert(typeof num);    //number  
 8     alert(typeof boo);    //boolean
 9     alert(typeof nu);        //typeof null  = object
10
11
12
13   var arr =[2,3,1];14     var fun = function(){
15         return 2;
16     }
17
18     alert(typeof arr);             //typeof Array  = object 

19     alert(arr instanceof Array);     //true      so instanceof is better than typeof for Array's testing
20     alert(arr instanceof Object);    //true
21
22     alert(typeof fun);            //typeof Function = function

  作者:没错high少是我                                                                                                                                                                                     

出处:http://www.cnblogs.com/highshao/                                                                                                         
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/highshao/p/5440824.html

JavaScript实现对象的深度克隆及typeof和instanceof【简洁】【分享】相关推荐

  1. java中实现对象的深度克隆

    1.什么是深度拷贝和浅拷贝 python中有深度拷贝(也可以叫深度克隆)和浅拷贝,同样在java中很多时候需要深度拷贝对象,所谓的深度拷贝对象指的就是对于对象的所用数据及其全部进行copy一份,变成两 ...

  2. Java对象的深度克隆

    文章目录 前言 代码 后记 前言 日常写代码过程中我们需要对数据和对象等进行克隆,然而对引用类型必须要自己重写clone()方法,对于复杂的对象并不那么好写,而且每个对象都需要重写一次.这里我不重写c ...

  3. 啥是对象的浅度克隆和深度克隆?

    在日常的开发中,我们经常会遇到需要克隆一个对象,对克隆的对象操作之后不影响原有对象以及与之关联的对象 Java的Object类提供了clone方法,用来进行克隆对象,不过JDK提供的clone()方法 ...

  4. 实现 Cloneable接口深度克隆对象

    实现 Cloneable接口深度克隆对象 Body对象中有Head对象,Head对象中有Face对象,Face对象中有int变量和String变量. 实现Boby对象的深度克隆,看下面代码: pack ...

  5. 对象的深度复制和浅复制 (深度拷贝和浅拷贝)

    对象的深度复制和浅复制 (深度拷贝和浅拷贝) 作者:邓家海 时间:2018年2月11日 21:46:22 我们在实际的开发项目里面为了使得开发更加的便捷和方便,总会不经意的使用一些第三方的持久化框架( ...

  6. php 变量类型 typeof,typeof和instanceof的区别是什么

    typeof和instanceof的区别是:typeof的返回值是一个字符串,用来说明变量的数据类型:instanceof的返回值是布尔值,用于判断一个变量是否属于某个对象的实例. 比较typeof与 ...

  7. javascript 深度克隆对象

    js一般有两种不同数据类型的值: 基本类型(包括undefined,Null,boolean,String,Number),按值传递: 引用类型(包括数组,对象),按址传递,引用类型在值传递的时候是内 ...

  8. JavaScript复习笔记(3)——数据类型(null、undefined、NaN)与深度克隆

    JavaScript中的数据类型:Number.Boolean.String.Object.Function 但是此外还有一些容易混淆的类型如null.undefined.NaN.Array的概念 f ...

  9. [js] 请写一个性能最好的深度克隆对象的方法

    [js] 请写一个性能最好的深度克隆对象的方法 const deepClone = (obj) => {const copy = obj instance Array ? [] : {};for ...

  10. java deep clone util_实现对象深度克隆(deepClone)的三种方案

    转:http://www.cnblogs.com/wangzhichao/archive/2013/04/11/3014419.html 方案一:利用现代浏览器支持的JSON对象做一次中转,实现深度克 ...

最新文章

  1. 贪心 ---- 贪心 + STL维护 + 划分集合 L. Neo-Robin Hood(好题)
  2. 【Java学习笔记之四】java进制转化
  3. Windows下安装MySQL压缩zip包
  4. 解决properties文件乱码问题(eclipse和MyEclipse)
  5. 排序算法-04快速排序(Python实现)
  6. 实用的编程网站—良好的开端
  7. jquery-幻灯片的移动分析
  8. 不联网redhat5.5安装oracle11g,redhat5.5_64位上安装oracle11gR2_步骤+问题解决
  9. mapred linuxtaskcontroller目录权限问题探究
  10. 使用61850网关实现modbus和电力iec61850协议的转换
  11. Batch Normalization(BN层)详解
  12. python gephi可视化 金庸人物关系图
  13. Paxos算法和Raft算法
  14. SQL SERVER 2000个人版下载
  15. Arnold置乱变换的代码实现与置乱度分析
  16. 京东方高级副总裁姜幸群:AIoT技术赋能企业物联网转型
  17. 什么是信息安全,怎么保障信息安全?
  18. 密码格式 数字+字母
  19. 视频教程-HoloLens与ARcore第三视角开发-其他
  20. nacos中startup 启动报错

热门文章

  1. Python eval 函数
  2. 【学术杂谈】博士毕业都去哪儿了,谈谈学术的这条路该如何走
  3. 【实践】BiLSTM上的CRF,用命名实体识别任务来解释CRF(2)损失函数
  4. 分享 | 绝对值得一看的深度学习三巨头之一的Yoshua Bengio清华大学讲座视频
  5. 如何防止softmax函数上溢出(overflow)和下溢出(underflow)
  6. 统计学习方法读书笔记14-逻辑斯蒂回归代码实现与最大熵代码实现
  7. python如何识别文件中的空行?
  8. 探究Windows内核你知多少
  9. 二分法03:x 的平方根
  10. 28线性空间02——坐标、坐标变换与基变换、过度矩阵