1.

// 第一种  解构赋值  缺点:只能拷贝对象的第一层,如果对象中属性也是对象的话,没有办法进行深度的拷贝
    var obj = {
        username: "张三",
        age: 18
    }
    var obj1 = {
        ...obj
    }
改变obj的值,不会影响obj1的值
2.
 // 第二种    对象的合并
    var obj2 = Object.assign({}, obj);
    console.log(obj2);
3.
/ 第三种  JSON暴力转换
    var obj3 = JSON.parse(JSON.stringify(obj));
    console.log(obj3);
 
 
 
当对象中还包含对象时,怎么实现深拷贝
 
(1)定义并初始化一个对象
  var person = {
        name1: "张三",
        age1: 18,
        person1: {
            name2: "李四",
            age2: 21,
            person2: {
                name2: "王五",
                age2: 12,
            }
        }
    }
(2)如果对person对象进行遍历,将person的属性全部给一个新的对象,那么当最外面的一层person对象中的属性的属性值变化时,不会影响到里面的值。
        下面两行 console.log(obj);不会有变化
  var obj={};
    for (key in person) {
       obj[key] = person[key]
    }
    console.log(obj);
    person.name1="张三改";
对象深拷贝的方法_初始化

 

 

    console.log(obj);对象深拷贝的方法_初始化_02

 

对象深拷贝的方法_赋值_03

 

(3)如果对第二层对象person1进行更改或者是第三层对象person2进行更改,那么obj中也会改变

person.person1.name2="李四改";
    console.log(obj);对象深拷贝的方法_json_04

 

 

对象深拷贝的方法_属性值_05

 

 

person.person1.name2="李四改";
    console.log(obj);
    person.person1.person2.name2="王五改";
    console.log(obj);对象深拷贝的方法_初始化_06

 

 

对象深拷贝的方法_初始化_07

 

 (4)怎么实现多层对象深拷贝

 
   function deepClone(obj, newObj) {
    var newObj = newObj || {};
    for (let key in obj) {
        if (typeof obj[key] == 'object') {
            newObj[key] = (obj[key].constructor === Array) ? [] : {}
            deepClone(obj[key], newObj[key]);
        } else {
            newObj[key] = obj[key]
        }
    }
    return newObj;
}
console.log(deepClone(person,{}));