js对象的深拷贝和浅拷贝

411 阅读1分钟

js对象的深拷贝的方法

定义: 创建一个新对象,将原始对象从内存中完整的拷贝一份出来,从堆内存中开辟了一个新的区域存放新对象,新对象和原始对象完全没关系

var person = {
    name: 'mangoyi',
    age: 23,
    eduations: ['primary', 'middle', 'university'],
    skill: {
        javascript: 'well',
        css: 'good',
        html: 'well'
    }
};
  1. JSON
// JSON 深拷贝
var jsonClonePerson =  JSON.parse(JSON.stringify(person));

// 当对象中包含function方法时,深拷贝失败
var person = {
    speak: function() {
        console.log('go on')
    }
}
var jsonClonePerson = JSON.parse(JSON.stringify(person)); // speak属性丢失
  1. Jquery extend
// jquery库
var extendClonePerson = $.extend(true, {}, person);
  1. lodash cloneDeep
// lodash库
var lodashClonePerson = _.cloneDeep(person);
  1. 原生JS
function cloneDeep(source) {
    var target = Array.isArray(source) ? [] : {};
    for (let key in source) {
        if (typeof source[key] === 'object') {
            target[key] = cloneDeep(source[key);
        } else {
            target[key] = source[key];
        }
    }
    return target;
}

var cloneDeepPerson = cloneDeep(person);

js对象的浅拷贝的方法

定义:创建一个新对象,这个对象对原始对象属性值的一份拷贝。如果属性值是基本数据类型,拷贝的就是基本数据类型的值,如果属性是引用类型,拷贝的就是内存地址。所以新对象和原始对象依然引用同一个内存地址。

  1. Object.assign

Object.assign(target, source)方法将所有可枚举的值从一个或多个源对象复制到目标对象,将返回目标对象

    var clonePerson = Object.assing({}, person);
  1. JS枚举
function clone(source) {
    let target = Array.isArray(source) ? [] : {};
    for(let key in source) {
        target[key] = source[key]
    }
}