//测试Chrome版本 40.0.2214.115 m //如有错误欢迎指出 //深浅拷贝 //写过复杂的,做了各种判断的那种 //想想写个简单容易一眼看到头的 var a1={}; var a2={ namex:"xxx", getName:function(){ alert(namex); }, xx:{ namexx:"xxx", } }; //一个向另一个加另一个上面没有的属性 //很简单 var copy=function(){ //浅拷贝 var name, target=arguments[0], src=arguments[1]; for(name in src){ if(src[name]===target[name]){ continue; } target[name]=src[name]; } } //copy(a1,a2); //console.info(a1);// //深拷贝 //浅拷贝代码改改 //注意两个问题 //明确谁向谁拷贝 //第二个要有返回值(return),不然返回都为 undefined var deepCopy=function(){ var name, target=arguments[0], src=arguments[1]; //再做个判断,若是再次拷贝时,target[name]很可能为空 if(!(typeof(target)==="object")){ target={}; } for(name in src){ if(src[name]===target[name]){ continue; } /* if( target !==null && typeof(src[name])==="object"){ target[name]=deepCopy(target[name],src[name]); }else{ target[name]=src[name]; } */ if( src[name] !==null && typeof(src[name])==="object"){ //src就是引用xx --->target --------> {namexx:"xxx",} target[name]=deepCopy(target[name],src[name]); //target[name]=deepCopy(target[name]!==undefined?target[name]:{} ,src[name]); console.trace(); }else if(src[name]!==undefined){ target[name]=src[name]; } //target[name]=src[name]; } return target; }; var a3={}; var a4={ namex:"xxx", getName:function(){ alert(namex); }, xx:{ namexx:"xxx", } }; deepCopy(a3,a4); console.info(a3); a4.namex="我是谁";//深拷贝后不会再受到影响 console.info(a3);