浅拷贝和深拷贝
在某次项目中被深浅拷贝坑了,特此记录下。
var a = 1
var b = a
var b = 2
a===b //false
a-->1
b-->2
var a = {c:1}
var b = a
b.c = 2
b===a //true
a-->{c:2}
b-->{c:2}
对象的赋值,共享了地址,所以一个改变,另一个也会发生变化。也就是增加了一个指针指向已经存在的内存,这也就是浅拷贝。
由于数组也是对象,Array中大部分操作都是浅拷贝,所以操作的时候需谨慎。
var arr1 = [1,2,3]
var arr2 = arr1;
arr2[0] = 2
arr1===arr2 //true
arr1-->[2,2,3]
arr2-->[2,2,3]
如果处理这种情况,只要改变内存地址的指向其实就可以了,举个简单的例子
var arr1 = [1,2,3]
var arr2 = arr1.concat()
arr2[0] = 4;
arr2 === arr1 //false
arr1-->1,2,3
arr2-->4,2,3
对象的话就需要遍历这个对象进行复制操作了
function deepCopy(obj){
const result = {}
for(let key in obj){
if(typeof obj[key] ==='object'){
result[key] = deepCopy(obj[key])
}else{
result[key] = obj[key]
}
}
return result
}
es6提供的一个Object.assign的方法
const obj1 = {a:1}
const obj2 = Object.assign({},obj1) //注意第一个参数是{}
obj2.a = 2
obj2 === obj1 //false
obj2-->{a:2}
obj-->{a:1}