开门见山直接来,先明确几个核心概念
1.首先浅拷贝和深拷贝只针对想Object,Array这样的复杂对象,简单来说,浅拷贝只复制一层对象的属性,二深拷贝则复制了所有的层级。
2.对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没 有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会 改变,而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。
3.贴上代码:
(1)浅拷贝:obj对象中的值 1 直接复制到 shallow中的1,
但是数组地址同时指向了一个堆,没有在栈里开辟新地址,所以牵一发动全身的改变
(2)深拷贝:无论是字符串值,还是数组的对象值,都全部深层复制一份,数组在栈里面重新开了一块地址,所以,一个改变,互不影响。
//典型的浅拷贝
var obj = {a:1,
b:[1,2,3,4,5]
}
function shallowcopy(src, options){
var src = src || {};
for(var item in options){
src[item] = options[item];
}
return src
}
var newArr = {};
var show = shallowcopy(newArr,obj)
console.log(show);
newArr.b[0] = 10;
console.log(newArr,obj)
//典型的深拷贝
function deepcopy(src,options){
var src= src ||{};
for(var item in options){
if(typeof options[item] === 'object'){
src[item] = (options[item].constructor === Array) ? [] : {}
deepcopy(src[item],options[item])
}else{
src[item] = options[item]
}
}
return src;
}
var newArr = {};
var show = deepcopy(newArr,obj)
console.log(show);
newArr.b[0] = 10;
console.log(newArr,obj)
---恢复内容结束---