文章目录
一、利用JSON方法
最简单的方式,缺陷是原型链没有拷贝,函数和null不会拷贝
var copy1 = function (obj) {
return JSON.parse(JSON.stringify(obj));
}
var a = {a:function(){console.log('hello world')},b:{c:1},c:[1,2,3],d:"wanger",e:new Date(),f:null,g:undefined}
var b = copy1(a)
console.log(a,b)
二、利用函数的自调用
完整的深拷贝
var copy1=function(obj){
if(obj===null){return obj}
if(typeof obj !== 'object'){return obj}
if(obj.constructor==='Date'){return new Date(obj)}
if(obj.constructor==='RegExp'){return new RegExp(obj)}
var newObj=new obj.constructor() //保持继承链
for(var key in obj){
if(obj.hasOwnProperty(key)){ //不遍历其原型链上的属性
var val=obj[key];
newObj[key]=typeof val ==='object'?arguments.callee(val):val; // 使用arguments.callee解除与函数名的耦合
}
}
return newObj;
}
var a = {a:function(){console.log('hello world')},b:{c:1},c:[1,2,3],d:"ljy",e:new Date(),f:null,g:undefined}
var b = copy1(a);
console.log(a,b);