1.浅拷贝

  • 浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象
  • 既传值也传址

    1. var arr =[1,2,3];
    2. var b = arr;
    3. b.push(4);
    4. console.log(arr);

    /浅拷贝和深拷贝 - 图1

    2.深拷贝

  • 深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响

  • 只传递值

    1.如果对象中的属性是简单数据类型,实现深拷贝

    1. {...obj}
    2. Object.assign()
    3. <script>
    4. var obj ={name:"li",age:18}
    5. // var a={...obj}; 实现深拷贝
    6. //也可以用
    7. var a =Object.assign({},obj)
    8. obj.id=100 //添加不会影响原来数组或对象结构
    9. console.log(a);
    10. </script>
    1. var arr = [{name:"cheng"},{name:"zhang"},{name:"li"}];
    2. var res = [...arr];
    3. res[0].name="huang";
    4. res.push({name:"vue"});
    5. console.log(arr);

    浅拷贝和深拷贝 - 图2

    2.遇到复杂类型(array+object)

    1. var obj = {name:{name:"cheng"}};
    2. function deepClone(obj){
    3. /* 1.能够识别数组和对象了 */
    4. let result;
    5. if(typeof obj=="number" || obj == null || typeof obj=="boolean"||typeof obj=="string"){
    6. return obj;
    7. }
    8. if(obj instanceof Array || typeof obj == "object"){
    9. /* 2.对拷贝的值作初始值得设定 */
    10. if(obj instanceof Array){
    11. result = [];
    12. }else if(typeof obj =="object"){
    13. result = {};
    14. }
    15. /* 3.需要将obj克隆到result中 */
    16. for(let key in obj){
    17. result[key] = deepClone(obj[key]);
    18. }
    19. return result;
    20. }
    21. }
    22. var res = deepClone(obj);
    23. console.log(res)
    24. /*
    25. result = {name:deepClone({name:"cheng"})}
    26. result = {name:{name:deepClone("cheng")}}
    27. result = {name:{name:"cheng"}}
    28. */
    29. console.log(typeof "fd")