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

时间:2021-07-20 16:29:06

JavaScript实现对象的深度克隆

代码实现如下:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>clone</title> <script type="text/javascript">
//对象深度克隆方法 //////////给Object添加一个clone()方法,完成深度克隆对象。。。yeahhhhh!!!
Object.prototype.clone = function(obj) { var o,i,j,k; if(typeof(obj)!="object"||obj ===null) //支持string、boolean、number等
return obj; if(obj instanceof (Array)){ //Array类型
o=[];
i=0;
j=obj.length;
for(;i<j;i++){
if(typeof(obj[i])=="object"&&obj[i]!=null){
o[i]=arguments.callee(obj[i]); //arguments.callee() 调用函数本身,实现递归
}else{
o[i]=obj[i];
}
}
}
else{ //最后为Object类型
o={};
for(i in obj){
if(typeof(obj[i])=="object"&&obj[i]!=null){
o[i]=arguments.callee(obj[i]);
}else{
o[i]=obj[i];
}
}
}
return o;
} var obj1 = {
name:"Lee",
age:25, //obj的son对象属性 son:{
sname:"john",
sage:8,
play:function () {
return this.sname+" can play basketball!";
}, //son 的dog 对象属性
dog:{
dogName:"coco",
run:function() {
return "john's dog, "+this.dogName+" can run!";
}
}
},
sing:function(){
return this.name+" can sing!";
},
}; alert(obj1.name); //Lee
alert(obj1.son.play());   //john can play basketball!
alert(obj1.son.dog.run()); //john's dog, coco can run! //对象克隆测试:
var obj2 = clone(obj1); alert(obj2.name); //Lee
alert(obj2.son.play()); //john can play basketball!
alert(obj2.son.dog.run()); //john's dog, coco can run! </script>
</head>
<body>
<div></div>
</body>
</html>

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

测试结果:

     var str = "abc";
var num = 120;
var boo = false;
var nu = null;
var ss = clone(str);
var nn = clone(num);
var bb = clone(boo);
var nnn = clone(nu); alert(ss); //abc
alert(nn);   //
alert(bb);   //false
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";
var num = 120;
var boo = false;
var nu = null;    alert(typeof str);    //string
alert(typeof num);    //number  
alert(typeof boo);    //boolean
alert(typeof nu); //typeof null = object 13   var arr =[2,3,1];
var fun = function(){
return 2;
} alert(typeof arr);      //typeof Array = object alert(arr instanceof Array);  //true   so instanceof is better than typeof for Array's testing
alert(arr instanceof Object); //true alert(typeof fun);     //typeof Function = function

  作者:没错high少是我                                                                                                                                                                                     

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