美文网首页
浅拷贝、深拷贝

浅拷贝、深拷贝

作者: 有灵魂 | 来源:发表于2019-03-22 12:37 被阅读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);
    

    相关文章

      网友评论

          本文标题:浅拷贝、深拷贝

          本文链接:https://www.haomeiwen.com/subject/jmplvqtx.html