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/                                                                                                        
  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

JavaScript实现对象的深度克隆及typeof和instanceof【简洁】【分享】的更多相关文章

  1. javascript中对象的深度克隆

    记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html 今天就聊一下一个常见的笔试.面试题,js中对象的 ...

  2. js对象的深度克隆

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. MyDAL - 引用类型对象 .DeepClone() 深度克隆[深度复制] 工具 使用

    索引: 目录索引 一.API 列表 .DeepClone() 用于 Model / Entity / ... ... 等引用类型对象的深度克隆 特性说明 1.不需要对对象做任何特殊处理,直接 .Dee ...

  4. JAVA对象的深度克隆

    有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值! 也许你会说,用clone()不就行了?!你的想法只 ...

  5. JavaScript对象之深度克隆

    也不知道从什么时候开始,前端圈冒出了个新词:对象深度克隆.看起来好像很高大上的样子,实际上并不新鲜,在我们的实际项目开发中,你可能早已用到,只不过由于汉字的博大精深,有些原本很简单的事物被一些看似专业 ...

  6. javascript对象的深度克隆

    在做项目的时候需要向对象里面添加新属性,又不想修改原对象.于是就写: var newObj = oldObj,但是新对象属性改变后就对象也会跟着改变,这是因为无论是新对象还是旧对象,指向的内存地址都是 ...

  7. 【JavaScript代码实现三】JS对象的深度克隆

    function clone(Obj) { var buf; if (Obj instanceof Array) { buf = []; // 创建一个空的数组 var i = Obj.length; ...

  8. JavaScript的深度克隆

    1.JavaScript的五种基本数据类型: Number.String.Boolean.null.undefined. 2.typeof返回的六种数据类型: Number.String.Boolea ...

  9. js对象简单、深度克隆(复制)

    javascript的一切实例都是对象,只是对象之间稍有不同,分为原始类型和合成类型.原始类型对象指的是字符串(String).数值(Number).布尔值(Boolean),合成类型对象指的是数组( ...

随机推荐

  1. 跨多种环境部署 Gearman -改善应用程序性能和降低服务器负载

    您可能想要将工作扩散到一个大型机器群体中,或者想要在不同语言和环境之间共享功能,那么开放源码的 Gearman 服务可以让您轻松地将工作分布到网络中的其他机器.本文将介绍 Gearman 的一些典型应 ...

  2. nginx 安装过程中的not found

    linux 发行版本:centos zlib not found openssl not found yum install zlib-devel yum install openssl-devel

  3. poj——1274 The Perfect Stall

    poj——1274   The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25709   A ...

  4. css三大布局

    标准流: 从左到右,从上到下块级元素独占一行,行内元素碰到父盒子边缘换行 浮动: 特点 1 元素浮动之后不占据原来的位置(脱标),变成立体,下面可以有东西,只影响下面的 2 浮动的盒子在一行上显示 3 ...

  5. Jinja2如何默认将None 值显示为空字符串?

    在Jinja模板中 {% if User %} {{ User.name }} {% endif %} 可以简化为下面的写法,同时,保证返回值为空,而不是显示为“None” {{ User.name ...

  6. OpenWRT解决因PPPOE丢包导致频繁掉线问题

    其关键在于这两个参数 lcp-echo-interval 1   #发送间隔秒 lcp-echo-failure 5    #5次未响应断开 因为OpenWRT默认的设置为1秒发送一次 5次没有响应就 ...

  7. CentOS7 设置系统时间

    在CentOS 6版本,时间设置有date.hwclock命令, 硬件时钟和系统时钟 (1) 硬件时钟 RTC(Real-Time Clock)或CMOS时钟,一般在主板上靠电池供电,服务器断电后也会 ...

  8. Domino/Xpages Bootstrap 动态生成首页功能

    因为之前用户须要做个动态首页的功能,但一般用户又不熟HTML,所以最佳的方法能够使用拖动的方法来配置首页,一些主要的组件是已经帮用户的依据实际数据情况已经制作OK,用户仅仅须要简单配置就能够更改首页, ...

  9. 输入年份,然后打印出该年的万年历,以及标识出当天日期。相似于linux下的cal -y结果。

    public class Permanent { public static boolean isLeapYear(int year){//能被4整除但不能被100整除.或者能被400整除 boole ...

  10. Qt 用户登录界面

     使用QT创建自己的登录窗口: 主要步骤:    1.窗口界面的绘制     2.沟通数据库进行密码验证 void MainWindow::on_pushButton_clicked() { // 连 ...