作者:邹润阳
链接:https://www.zhihu.com/question/23031215/answer/46220227
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
链接:https://www.zhihu.com/question/23031215/answer/46220227
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
感觉大家好像都没有正面回答题主的问题呢。题主问的是深复制和浅复制的区别,大家答的却都是如何实现深复制。我来答一发~
先抛开jQuery,上几句简单的代码:
因为JavaScript存储对象都是存地址的,所以浅复制会导致 obj 和 obj1 指向同一块内存地址,大概的示意图如下。而深复制一般都是开辟一块新的内存地址,将原对象的各个属性 逐个复制出去。如下图所示:
<img src="https://i-blog.csdnimg.cn/blog_migrate/274e28b143992f65452459684302712b.jpeg" data-rawwidth="3264" data-rawheight="1224" class="origin_image zh-lightbox-thumb" width="3264" data-original="https://pic1.zhimg.com/6604224933c95787764d941432a1f968_r.jpg">
因此,如果你使用浅复制,你会发现:
先抛开jQuery,上几句简单的代码:
var obj = { a:1, arr: [1,2] };
var obj1 = obj; //浅复制
var obj2 = deepCopy(obj); //深复制
因为JavaScript存储对象都是存地址的,所以浅复制会导致 obj 和 obj1 指向同一块内存地址,大概的示意图如下。而深复制一般都是开辟一块新的内存地址,将原对象的各个属性 逐个复制出去。如下图所示:
<img src="https://i-blog.csdnimg.cn/blog_migrate/274e28b143992f65452459684302712b.jpeg" data-rawwidth="3264" data-rawheight="1224" class="origin_image zh-lightbox-thumb" width="3264" data-original="https://pic1.zhimg.com/6604224933c95787764d941432a1f968_r.jpg">
因此,如果你使用浅复制,你会发现:
var cloneObj = function(obj){
var str, newobj = obj.constructor === Array ? [] : {};
if(typeof obj !== 'object'){
return;
} else if(window.JSON){
str = JSON.stringify(obj), //系列化对象
newobj = JSON.parse(str); //还原
} else {
for(var i in obj){
newobj[i] = typeof obj[i] === 'object' ?
cloneObj(obj[i]) : obj[i];
}
}
return newobj;
};
作者:知乎用户
链接:https://www.zhihu.com/question/23031215/answer/31944721
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。