您的位置:首页 > Web前端 > JavaScript

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.

这样我们在反序列化的时候就能获取相对应的对象引用。
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: