Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
前置条件:JavaScript中的深拷贝和浅拷贝是面试过程中经常会被问到的问题,以前我同样也被问到过这个问题。当时很快反应就是用var obj2=JSON.parse(JSON.stringify(obj1))来实现。可是并没有那么简单的,哈哈哈,面试官要求用原生的JavaScript来实现,这就是考验你对于深拷贝和浅拷贝的理解程度。
概念:
深拷贝:创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”,新对象跟原对象不共享内存,修改新对象不会改到原对象
浅拷贝: 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用
分析:深复制和浅复制只针对像 Object, Array 这样的复杂对象的。简单来说,浅复制只复制一层对象的属性,而深复制则递归复制了所有层级。浅复制只会将对象的各个属性进行依次复制,并不会进行递归复制,而 JavaScript 存储对象都是存地址的,所以浅复制会导致 [obj.arr] 和 shallowObj.arr 指向同一块内存地址。而深复制则不同,它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制到新对象上。这就不会存在上面 obj 和 shallowObj 的 arr 属性指向同一个对象的问题。
实现:
function copy(arr){\
var obj=arr.constructor==Array?[]:{};\
//第二种方法 var obj=arr instanceof Array?[]:{}\
for(var item in arr){\
if(typeof arr[item]==="object"){\
obj[item]=copy(arr[item]);\
}else{\
obj[item]=arr[item];\
}\
}\
return obj;\
}\
var obj={a:1,b:2,c:{d:1,e:[3,4,5]}}\
var newobj=copy(obj);\
obj.c.e.push(7);\
console.log(obj);\
console.log(newobj);