js对象的拷贝复制使用小结

对象的浅拷贝

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.

这样我们在反序列化的时候就能获取相对应的对象引用。

你可能感兴趣的:(js对象的拷贝复制使用小结)