写一个函数,用来实现对象的深拷贝?

在JavaScript中,变量的拷贝分为两种,一种是值拷贝,一种是内存地址拷贝,意思是当赋值给变量的只是一个简单的基本数值时,变量与变量之间的储存空间是相互独立,两个变量之间的改变不会相互影响,而当赋值给变量的是一个对象或数组的时候,变量与变量之间的存储空间将会指向同一个内存空间,当某一个变量改变时,内存空间的值也会改变。
要实现深拷贝有很多办法,有最简单的 JSON.parse() 方法,也有常用的递归拷贝方法,和ES5中的 Object.create() 方法。
方法一:使用 JSON.parse() 方法
要实现深拷贝有很多办法,比如最简单的办法是使用 JSON.parse():
但是这种方法也有不少坏处,譬如它会抛弃对象的constructor。也就是深拷贝之后,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object。
这种方法能正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,即那些能够被 json 直接表示的数据结构。RegExp对象是无法通过这种方式深拷贝。
方法二:递归拷贝
为了避免相互引用的对象导致死循环的情况,则应该在遍历的时候判断是否相互引用对象,如果是则退出循环。
function deepCopy(obj,copy){
for(var i in obj){
if(typeOf obj[i] == ‘object’){ //判断是否为对象
deepCopy(obj[i],copy[i]);//回调深拷贝函数
}
else{
copy[i] = obj[i]; //不是对象直接复制
}
}
return copy;
}
这样就能将所有的数据都拷贝到另一个储存空间里。
方法三:使用Object.create()方法
直接使用var newObj = Object.create(oldObj),可以达到深拷贝的效果。

你可能感兴趣的:(写一个函数,用来实现对象的深拷贝?)