Javascript 克隆 clone 对象


原生方式实现:

            let cloneObj,obj = { a:1, b:"string b", c:[1,2], d:{ e:1 }};

            //方式一: JSON 序列化与反序列化
            cloneObj = JSON.parse(JSON.stringify(obj))

            //方式二: ES6 的 Object.assign
            cloneObj = Object.assign({}, obj);// 浅拷贝,还是引用了 obj 的 c 与 d

            //方式三:ES6 的扩展运算符
            cloneObj = { ...obj };// 浅拷贝
        

说明:

  1. JSON.stringify/parse 的方式支持深拷贝。大批量的操作有性能问题,但常规使用基本不影响,支持克隆数组。

    此方式还有以下问题:Date 类型会被转为 ISO 格式的日期字符串,function、undefined、Types 会被忽略,null、NaN、Infinity 统一转为 null。

    如果 Date, function, Infinity, RegExps, Maps, Sets, Blobs, FileLists, ImageDatas 等这些复杂类型不在对象中,或不考虑这些数据丢失的问题,且数据量不大, JSON.parse(JSON.stringify(obj)) 将是你首选的克隆方式

  2. Object.assign 的克隆方式,是浅拷贝,因为不支持深拷贝,所以没有什么性能问题,支持克隆数组,例如:Object.assign([], arr)。此方式克隆不包含原型链上的属性。

  3. 扩展运算符 ...,也是浅拷贝,也支持克隆数组,例如:[ ...arr ]

使用第三方库克隆:

            //Lodash 深拷贝
            cloneObj = _.clone(obj);//浅拷贝
            cloneObj = _.cloneDeep(obj);//深拷贝

            //jQuery
            cloneObj = $.extend({}, obj);//浅拷贝
            cloneObj = $.extend(true, {}, obj);//深拷贝
        

第三方库推荐用 lodash ,jQuery 无法正确深拷贝 JSON 对象以外的类型,lodash 花了很多代码来处理 ES6 引入的新标准对象,能够拷贝的类型更全面一些。


back home