JavaScript实现对象的深度克隆及typeof和instanceof【简洁】【分享】
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少是我
转载于:https://www.cnblogs.com/highshao/p/5440824.html
JavaScript实现对象的深度克隆及typeof和instanceof【简洁】【分享】相关推荐
- java中实现对象的深度克隆
1.什么是深度拷贝和浅拷贝 python中有深度拷贝(也可以叫深度克隆)和浅拷贝,同样在java中很多时候需要深度拷贝对象,所谓的深度拷贝对象指的就是对于对象的所用数据及其全部进行copy一份,变成两 ...
- Java对象的深度克隆
文章目录 前言 代码 后记 前言 日常写代码过程中我们需要对数据和对象等进行克隆,然而对引用类型必须要自己重写clone()方法,对于复杂的对象并不那么好写,而且每个对象都需要重写一次.这里我不重写c ...
- 啥是对象的浅度克隆和深度克隆?
在日常的开发中,我们经常会遇到需要克隆一个对象,对克隆的对象操作之后不影响原有对象以及与之关联的对象 Java的Object类提供了clone方法,用来进行克隆对象,不过JDK提供的clone()方法 ...
- 实现 Cloneable接口深度克隆对象
实现 Cloneable接口深度克隆对象 Body对象中有Head对象,Head对象中有Face对象,Face对象中有int变量和String变量. 实现Boby对象的深度克隆,看下面代码: pack ...
- 对象的深度复制和浅复制 (深度拷贝和浅拷贝)
对象的深度复制和浅复制 (深度拷贝和浅拷贝) 作者:邓家海 时间:2018年2月11日 21:46:22 我们在实际的开发项目里面为了使得开发更加的便捷和方便,总会不经意的使用一些第三方的持久化框架( ...
- php 变量类型 typeof,typeof和instanceof的区别是什么
typeof和instanceof的区别是:typeof的返回值是一个字符串,用来说明变量的数据类型:instanceof的返回值是布尔值,用于判断一个变量是否属于某个对象的实例. 比较typeof与 ...
- javascript 深度克隆对象
js一般有两种不同数据类型的值: 基本类型(包括undefined,Null,boolean,String,Number),按值传递: 引用类型(包括数组,对象),按址传递,引用类型在值传递的时候是内 ...
- JavaScript复习笔记(3)——数据类型(null、undefined、NaN)与深度克隆
JavaScript中的数据类型:Number.Boolean.String.Object.Function 但是此外还有一些容易混淆的类型如null.undefined.NaN.Array的概念 f ...
- [js] 请写一个性能最好的深度克隆对象的方法
[js] 请写一个性能最好的深度克隆对象的方法 const deepClone = (obj) => {const copy = obj instance Array ? [] : {};for ...
- java deep clone util_实现对象深度克隆(deepClone)的三种方案
转:http://www.cnblogs.com/wangzhichao/archive/2013/04/11/3014419.html 方案一:利用现代浏览器支持的JSON对象做一次中转,实现深度克 ...
最新文章
- 贪心 ---- 贪心 + STL维护 + 划分集合 L. Neo-Robin Hood(好题)
- 【Java学习笔记之四】java进制转化
- Windows下安装MySQL压缩zip包
- 解决properties文件乱码问题(eclipse和MyEclipse)
- 排序算法-04快速排序(Python实现)
- 实用的编程网站—良好的开端
- jquery-幻灯片的移动分析
- 不联网redhat5.5安装oracle11g,redhat5.5_64位上安装oracle11gR2_步骤+问题解决
- mapred linuxtaskcontroller目录权限问题探究
- 使用61850网关实现modbus和电力iec61850协议的转换
- Batch Normalization(BN层)详解
- python gephi可视化 金庸人物关系图
- Paxos算法和Raft算法
- SQL SERVER 2000个人版下载
- Arnold置乱变换的代码实现与置乱度分析
- 京东方高级副总裁姜幸群:AIoT技术赋能企业物联网转型
- 什么是信息安全,怎么保障信息安全?
- 密码格式 数字+字母
- 视频教程-HoloLens与ARcore第三视角开发-其他
- nacos中startup 启动报错
热门文章
- Python eval 函数
- 【学术杂谈】博士毕业都去哪儿了,谈谈学术的这条路该如何走
- 【实践】BiLSTM上的CRF,用命名实体识别任务来解释CRF(2)损失函数
- 分享 | 绝对值得一看的深度学习三巨头之一的Yoshua Bengio清华大学讲座视频
- 如何防止softmax函数上溢出(overflow)和下溢出(underflow)
- 统计学习方法读书笔记14-逻辑斯蒂回归代码实现与最大熵代码实现
- python如何识别文件中的空行?
- 探究Windows内核你知多少
- 二分法03:x 的平方根
- 28线性空间02——坐标、坐标变换与基变换、过度矩阵