浅拷贝、深拷贝

2019-03-22  本文已影响0人  有灵魂

1、基本数据类型:string number boolean null undefined 的拷贝是按值拷贝,即为深拷贝
2、复杂数据类型:array object function 按引用操作,又分为浅拷贝和深拷贝

    // 基本数据类型:
    let arr = undefined
    arr1 = arr
    arr1 = 5
    console.log(arr);
    console.log(arr1);

复杂数据类型:

    // 一维数组的深拷贝: 1、slice()   2、concat() 3、ES6:   ...扩展符 4、Array.from()
    let arr = [1, 2, 3]
    arr1 = arr.slice()
    arr1 = arr.concat()
    arr1 = [...arr]
    arr1 = Array.from(arr)
    arr1[0] = 'b'
    console.log(arr); // [1, 2, 3]
    console.log(arr1); // ["b", 2, 3]
    // 一级对象的深拷贝:1、ES6: Object.assign(tartget, ...sources) 2、ES6: ...扩展符
    let obj = {a: 'a', b: 'b'}
    obj1 = Object.assign({}, obj)
    obj1 = {...obj}
    obj1.a = 'a1'
    console.log(obj); //{a: "a", b: "b"}
    console.log(obj1); //{a: "a1", b: "b"}
    // 多维数组,多维对象的深拷贝使用上述方法,无效, 即为浅拷贝
    let arr = [{a: 'a'}, {b: 'b'}]
    let arr1 = arr.concat()
    arr1[0].a = 'a1'
    console.log(arr); // [{a: 'a1'}, {b: 'b'}]
    console.log(arr1); // [{a: 'a1'}, {b: 'b'}]

可以实现的方法:1、JSON.parse(JSON.stringify()) 2、递归

    let arr = [{a: 'a'}, {b: 'b'}]
    let arr1 = JSON.parse(JSON.stringify(arr))
    arr1[0].a = 'a1'
    console.log(arr); // [{a: 'a'}, {b: 'b'}]
    console.log(arr1); // [{a: 'a1'}, {b: 'b'}]

递归:

    function deepcopy(obj) {
      if(typeof obj === 'object') { //说明参数是一个对象类型,但是数组也是对象,需要具体判断是不是数组类型。
          var result = obj.constructor === Array ? [] : {};
          for(let i in obj){ //遍历obj的每一项
              result[i] = typeof obj[i] === "object" ? deepcopy(obj[i]) : obj[i];
          }
      }else{
          var result = obj;
      }
      return result;
    }
    let arr = [{a: [11, 8]}, {b: 'b1'}]
    let arr1 = deepcopy(arr)
    arr1 = arr
    arr1[0].a[0] = 'a2'
    console.log(arr, 4, arr1);
上一篇下一篇

猜你喜欢

热点阅读