浅拷贝和深拷贝

在某次项目中被深浅拷贝坑了,特此记录下。

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}