js对象的拷贝复制使用小结
2018-08-14 14:05
169 查看
对象的浅拷贝
1,Object.assign
var newobj = Object.assign({},curobj);
Object.assign是ES6新添加的接口,主要的用途是用来合并多个JavaScript的对象。
Object.assign()接口可以接收多个参数,第一个参数是目标对象,后面的都是源对象,assign方法将多个原对象的属性和方法都合并到了目标对象上面,如果在这个过程中出现同名的属性(方法),后合并的属性(方法)会覆盖之前的同名属性(方法)。
2,扩展运算符
扩展运算符实现对象的浅拷贝 效率比1差一点,差10%左右,但都很快
var {...obj2} = obj;
对象的深拷贝
1,json来实现,效率低。 2,$.extend()来实现,效率稍高, 大概比1的快一倍。 3,自己写的遍历方法,效率更高,比$.extend()快40% var clone = function (obj) { if(obj === null) return null if(typeof obj !== 'object') return obj; if(obj.constructor===Date) return new Date(obj); if(obj.constructor === RegExp) return new RegExp(obj); var newObj = new obj.constructor (); //保持继承链 for (var key in obj) { if (obj.hasOwnProperty(key)) { //不遍历其原型链上的属性 var val = obj[key]; newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合 } } return newObj; };
当然我们可能会遇到一些有意思的问题,比如当JSON中出现循环引用: 什么是循环引用呢?简单的举个例子: var object = {}; object.arr = [ object, object ]; object.arr.push(object.arr); object.obj = object; 在上面的代码中,对象的属性引用了自身或者自身的父级 FastJson是阿里的开源工具,它是如何处理这种问题的呢? 首先,fastjson会对引用进行检测,默认会以“引用标识($ref)”代替同一对象,来终止循环引用的出现。 circular-json.js 是前端js的序列化插件,专门用来解决循环引用的,它又是如何处理的呢? 方法似乎差不多,circular-json使用~作为特殊前缀符号来表示属性的所属父级 所以将它们序列化得到如下: {"arr":["~","~","~arr"],"obj":"~"} 这里的~指的就是object.arr的父级object. 这样我们在反序列化的时候就能获取相对应的对象引用。阅读更多
相关文章推荐
- angular2使用lodash深拷贝js对象
- js中对象的拷贝(复制)
- 使用slice方法进行js对象拷贝 得到新的对象 不再互相干扰 解决引用变量的指向问题
- js中对象的复制,浅复制(浅拷贝)和深复制(深拷贝)
- js对象深度拷贝、Object.assign()、Object.assign()复制非对象、Object.assign()浅拷贝
- js中对象复制以及apply方法的使用
- JS面向对象组件(五) -- 复制对象(拷贝继承)
- js对象复制——浅拷贝、深拷贝
- ADO.NET 2.0 - 读者询问能否使用 SqlBulkCopy 对象来大量复制文字文件
- js中获取事件对象的方法小结
- C++类对象的复制-拷贝构造函数(深拷贝,浅拷贝)
- 【转】ArcSDE复制数据时出现ORA-00955名称已由现有对象使用错误的解决方法
- js中关于String对象的replace使用详解
- 使用__doPostBack,js出错:缺少对象
- 深度复制一个对象方法。利用反射机制,不使用Serialization,也不使用ICloneable接口
- 使用序列化和反序列化机制深度复制对象
- 使用JS让一般人不能复制你的劳动成果
- 使用序列化和反序列化机制深度复制对象 (转)
- js预载入和JavaScript Image()对象使用介绍
- 使用JS禁止粘贴、复制、剪切操作