有效的对象拷贝应该是指深拷贝。
浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj2拷贝obj1时,一旦其中一个改变,其他的便会改变!
深拷贝:就是重新复制一块内存,这样就不会互相影响。有些时候我们定义一个数组,把这个数据赋值给跟多对象数组中的一个字段,当我们改变对象数组中的该字段的时候,我们会把原来的数组也改变了,这样就会引起其他数组对象中的对应的字段改变,这不是我们想要的。这个时候我们会用到深拷贝。
深拷贝的方法:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
var xiaoming = {
name : "xiaoming",
age : 18,
like : ["eat","sleep","js"],
gf : {
name : "xiaohua",
age : 16,
bf : {
name : "xiaohliyu",
age : 15
}
}
}
function deepCopy(obj){
//判断说明数据类型
if(typeof obj != "object"){
return obj//判断说明不是对象
}
var newObj=obj instanceof Array?[]:{};//声明一个新的对象,并进行判断
//遍历对象和数组
for(var k in obj){
if((typeof obj[k]=="object")){ //判断说明是否为对象
deepCopy(obj[k]);
}
newObj[k]=obj[k];
}
return newObj
}
//接下来可以试验一下
var a=deepCopy(xiaoming)//重新定义一个变量a对deeoCopy进行拷贝
a.name="likui"//将a对象的name属性重新赋值
console.log(a)//打印a
console.log(deepCopy(xiaoming))//打印deeoCopy
//得出结果两次打印的结果不为相同
</script>
</body>
</html