javascript中的深拷贝和浅拷贝
来源:互联网 发布:帝国cms采集插件下载 编辑:程序博客网 时间:2024/06/03 13:23
首先深复制和浅复制只针对像object,array这样的复杂对象。
浅只复制了一层对象的属性,深复制递归复制了所有层级。
简单的浅复制实现:
var obj = { a:1, arr: [2,3] };var shallowObj = shallowCopy(obj);function shallowCopy(src) { var dst = {}; for (var prop in src) { if (src.hasOwnProperty(prop)) { dst[prop] = src[prop]; } } return dst;}
因为浅复制只会将对象的各个属性进行依次复制,并不会进行递归复制,而 JavaScript 存储对象都是存地址的,所以浅复制会导致 obj.arr 和 shallowObj.arr 指向同一块内存地址。
导致的结果为:
shallowObj.arr[1] = 5;obj.arr[1] // = 5
而深复制则不同,它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制到新对象上。这就不会存在上面 obj 和 shallowObj 的 arr 属性指向同一个对象的问题。
var obj = { a:1, arr: [1,2] };var obj2 = deepCopy(obj);
需要注意的是,如果对象比较大,层级也比较多,深复制会带来性能上的问题。在遇到需要采用深复制的场景时,可以考虑有没有其他替代的方案。在实际的应用场景中,也是浅复制更为常用。
var cloneObj=function(obj){ var str,newobj=obj.constructor===Array?[]:{}; if (typeof obj!=='object') { return; }else if(window.JSON){ str=JSON.stringfy(obj); newobj=JSON.parse(str); }else{ for (var i=obj) { newobj[i]=typeof obj[i]==='object'?cloneObj(obj[i]):obj[i]; } } return newobj; };
原地址:https://www.zhihu.com/question/23031215
阅读全文
0 0
- javascript中的深拷贝和浅拷贝
- javascript中的浅拷贝和深拷贝
- javascript中的深拷贝和浅拷贝?
- javaScript中的浅拷贝和深拷贝
- JavaScript中的深拷贝和浅拷贝
- javascript中的深拷贝和浅拷贝?
- javascript中的深拷贝和浅拷贝
- javascript中的深拷贝和浅拷贝
- javascript 中的深拷贝和浅拷贝的区别
- javascript中的浅拷贝和深拷贝例子
- 浅析javaScript中的浅拷贝和深拷贝
- Javascript中的深拷贝与浅拷贝
- JavaScript中的深拷贝与浅拷贝
- JavaScript中的浅拷贝与深拷贝
- javascript 深拷贝和浅拷贝
- JavaScript深拷贝和浅拷贝
- JavaScript深拷贝和浅拷贝
- JavaScript的深拷贝和浅拷贝
- selinux-概念
- 我与插值萍水相逢续(2): 插值用于数据缩放存在的问题及解决方法
- _STA 主要用于判断当前设备是否存在
- python装饰器简介---这一篇也许就够了
- 动态内存分配
- javascript中的深拷贝和浅拷贝
- np.nonzero()
- 数据存储---REDIS cluster
- JAVA序列化
- selinux-实现
- python学习——函数及其参数
- Windows平台下的Java远程操作Linux系统中的HBase
- java字符判断并用 * 替换文字
- selinux-自定义