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. js去除字符串两边的空格

    bless = bless.replace(/(^\s*)|(\s*$)/g, "") // 去掉两边的空格

  2. Swift--Set的了解

    1. 创建和初始化一个空的set var letters = Set<Character>() 或者,如果上下文已经提供了类型信息,例如函数参数或已输入的变量或常量,则可以创建空的集合,其 ...

  3. oc温习六:预处理指令

    预处理:分析程序前先处理的语句,它可以识别散布在程序中的特定语句.所有的预处理语句都适用“#”开头,这个符号必须是一行中的第一个非空字符. 预处理可以大概分为三类:文件包含.宏定义和条件编译. 1.文 ...

  4. 【小记事】解除端口占用(Windows)

    开发中有时会因为端口占用而导致起项目时报错(如下图),这时候只要解除端口占用即可. 解除端口占用: 1.打开cmd(win+r),查看端口占用情况 netstat -ano | findstr 端口号 ...

  5. gitlab上fork的项目如何获取源更新

    1.添加上游项目地址 git remote add upstream URL 2.查看远程仓库信息 可以看到上游项目地址已经添加进来了 git remote -v 3.获取上游项目更新 获取到的更新会 ...

  6. Wannafly模拟赛2 C alliances(dfs序+二分)

    题目 https://www.nowcoder.com/acm/contest/4/C 题意 由n个点组成一个树,有m个帮派,每个帮派由一些个点组成,这些点以及它们两两路径上的所有点都属于该帮派的管辖 ...

  7. windows安装ZIP压缩版的Weblogic Server

    以前要装Weblogic Server的时候都是装的安装版,最近发现ZIP版本的Weblogic Server是一个只包含Weblogic Server的版本,于是就想着弄一下它. 这里用到的Webl ...

  8. Android KK后为何工厂模式下无法adb 无法重新启动机器 ?

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  9. JS表格分页组件:fupage的设计思路和详细使用方法(未来考虑开源,争取在2015年)

    一.背景         之前在秒针工作的时候,某js高级project师写了非常多自己的组件.当中一套是分页组件.叫做st-grid. 只是在我看来,bug太多.我常常给他反馈bug,我也不清楚为啥 ...

  10. Linux —— 查找与替换

    Linux —— 查找与替换 文本查找: grep, egrep, fgrep        grep:根据基本正则表达式定义的模式搜索文档,并将符合模式的文本行显示出来        注意:搜索时属 ...