浅拷贝赋给的是一个指针,并不是真正的值,仅仅是地址名不同,而地址却是同一个
var obj = { a:1, arr: [2,3] }; var shallowObj = shallowCopy(obj); function shallowCopy(src) { var dst = {}; for (var i in src) { dst[i] = src[i]; } return dst; } shallowObj.arr[1] = 5; console.log(obj.arr[1]) // = 5
我们通过dst[i] = src[i];复制引用类型的操作。引用类型的复制会为新的变量自动分配一个新的值保存在变量对象中,这个新的值,仅仅只是引用类型的一个地址指针。尽管他们相互独立,但是在变量对象中访问到的具体对象实际上是同一个
深拷贝不是单纯的复制指针了,而是把对象的属性也复制一遍
//push实现数组深拷贝 var arr = [1,2,3,4,5] var arr2 = copyArr(arr) function copyArr(arr) { var res = [] for (var i = 0; i < arr.length; i++) { res.push(arr[i]) } return res } arr2[0]=333; console.log(arr[0]);//1 console.log(arr2);//[333, 2, 3, 4, 5]
//对象深拷贝 var obj = { name: 'wo', sex: 'man', old: '18' } var obj2 = copyObj(obj) function copyObj(obj) { var res = {} for (var key in obj) { res[key] = obj[key] } return res } obj2.name="1111111"; console.log(obj2);//{name: "1111111", sex: "man", old: "18"} console.log(obj.name);//wo
深拷贝就是重新给对象在堆上分配一个空间,然后将复制内容到这个新的空间中