js深复制
程序员文章站
2022-05-04 13:54:03
一般来讲深复制主要是为了复制js对象中的引用类型,引用类型在普通的赋值操作下相当于是引用,修改复制对象也会影响原对象,简单的方法的话可以使用JSON.parse(JSON.stringify(obj)) 来实现深复制 然而这是没有考虑对象中有函数的情况,用var b = JSON.parse(JSO ......
一般来讲深复制主要是为了复制js对象中的引用类型,引用类型在普通的赋值操作下相当于是引用,修改复制对象也会影响原对象,简单的方法的话可以使用json.parse(json.stringify(obj)) 来实现深复制
然而这是没有考虑对象中有函数的情况,用var b = json.parse(json.stringify(a)) 这种方法的深复制没法复制对象里面的函数,而且属性的顺序也可能会出错。
这里记录一下用递归深复制可以复制函数的办法
function isarray(o){ return object.prototype.tostring.call(o)=='[object array]'; } function deepcopy(obj){ var newobj ; if(isarray(obj)){ newobj = [] ; }else if(typeof obj=="object"){ newobj = {} ; }else if(typeof obj=="function"){ return eval(obj.tostring()) }else{ return obj ; } for(var key in obj){ newobj[key] = arguments.callee(obj[key]) ; } return newobj ; }
其实函数的复制可以用eval(fun.otstrng())这样,加上对对象的判别,就完成里一个obj中有函数或者引用类型的复制。
注:es6中其实已经有isarray这个函数了,用法是array.isarray(yourarr),返回一个bool值