js:浅拷贝和深拷贝

 

 

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>

    // 浅拷贝
    // 1、基本的赋值 =
    let a = [0, 1, 2, 3, 4],
      b = a;
    console.log(a === b); //true
    a[0] = 1;
    console.log(a, b); //[1,1,2,3,4]

    // 2、Object.assing()
    let obj = {
      name: 'chen',
      age: '18'
    }
    let obj2 = {
      hobby: 'music'
    }
    let obj3 = Object.assign(obj2, obj)
    console.log(obj3)
    console.log(Object.assign({}, obj))


    // 深拷贝
    let test = {
      name: 'chen',
      message: {
        age: '18',
      }
    }
    let test2 = {}

    // 1、封装函数
    function deepClone(newObj, oldObj) {
      for (var k in oldObj) {
        let item = oldObj[k];
        if (item instanceof Array) {
          // 先判断是否是数组
          newObj[k] = [];
          deepClone(newObj[k], item)
        } else if (item instanceof Object) {
          // 再判断是否是对象
          newObj[k] = {};
          deepClone(newObj[k], item)
        } else {
          // 基本的数据类型就直接赋值即可
          newObj[k] = item
        }
      }
    }
    deepClone(test2, test)
    console.log(test2)

    test2.message.age = '20'
    console.log('--', test);
    console.log('--', test2);


    // 2、除了递归,我们还可以借用JSON对象的parse和stringify
    let o1 = {
      name: 'chen',
      message: {
        age: '18',
      }
    }
    let o2 = JSON.parse(JSON.stringify(test))
    o2.message.age = '20'
    console.log('o2--', o2);
    console.log('o1--', o1);


    // 3.除了上面两种方法之外,我们还可以借用JQ的extend方法。 需要依赖JQ库。
    $.extend([deep], target, object1[, objectN])
    // deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝
    // target Object类型 目标对象,其他对象的成员属性将被附加到该对象上。
    // object1  objectN可选。 Object类型 第一个以及第N个被合并的对象。
    let a = [0, 1, [2, 3], 4];
    b = $.extend(true, [], a);
    a[0] = 1;
    a[2][0] = 1;
    console.log(a, b);


    // 4、slice
    var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
    var aCopy = arr.slice();      //没有参数表示从头截取到尾部
    console.log(aCopy);  // ['A', 'B', 'C', 'D', 'E', 'F', 'G']
    console.log(aCopy === arr); // false
    arr[0] = 'a'
    aCopy[0]='1'
    console.log(arr); // false
    console.log(aCopy); // false

  </script>
</body>

</html>

 

posted @ 2020-12-28 22:31  葡萄想柠檬  Views(147)  Comments(0Edit  收藏  举报
目录代码