拷贝(深拷贝)

①递归方式实现深拷贝

/** 深拷贝 */
objDeepCopy: function(source) {
    var sourceCopy = source instanceof Array ? [] : {};
    for (var item in source) {
        if (typeof source[item] === 'object') {
            if (source[item] === null) {
                sourceCopy[item] = null;
            } else {
                sourceCopy[item] = this.objDeepCopy(source[item]);
            }
        } else {
            sourceCopy[item] = source[item];
        }
    }
    return sourceCopy;
},

②用 JSON.stringify 把对象转换成字符串,再用 JSON.parse 把字符串转换成新的对象。

可以转成 JSON 格式的对象才能使用这种方法,如果对象中包含 function 或 RegExp 这些就不能用这种方法了。

// #通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone(obj) {
  let _obj = JSON.stringify(obj);
  let objClone = JSON.parse(_obj);
  return objClone;
}

③Object.assign()拷贝

当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。

④通过jQuery的extend方法实现深拷贝

let $ = require('jquery');
let obj1 = {
   a: 1,
   b: {
     f: {
       g: 1
     }
   },
   c: [1, 2, 3]
};
let obj2 = $.extend(true, {}, obj1);

⑤lodash.cloneDeep()实现深拷贝

let _ = require('lodash');
let obj1 = {
    a: 1,
    b: { f: { g: 1 } },
    c: [1, 2, 3]
};
let obj2 = _.cloneDeep(obj1);

 

 参:https://www.jianshu.com/p/1b212581a8d5

posted @ 2019-12-10 15:14  wxid_m2pywu7fxu1f  阅读(246)  评论(0编辑  收藏  举报