深度克隆

2019-03-14  本文已影响0人  fb941c99409d
1、数据类型:
    * 数据分为基本的数据类型(String, Number, boolean, Null, Undefined)和对象数据类型
    - 基本数据类型:
      特点: 存储的是该对象的实际数据
    - 对象数据类型:
      特点: 存储的是该对象在栈中引用,真实的数据存放在堆内存里
2、复制数据
    - 基本数据类型存放的就是实际的数据,可直接复制
      let number2 = 2;
      let number1 = number2;
    - 克隆数据:对象/数组
      1、区别: 浅拷贝/深度拷贝
         判断: 拷贝是否产生了新的数据还是拷贝的是数据的引用
         知识点:对象数据存放的是对象在栈内存的引用,直接复制的是对象的引用
         let obj = {username: 'kobe'}
         let obj1 = obj; // obj1 复制了obj在栈内存的引用
      2、常用的拷贝技术
        1). arr.concat(): 数组浅拷贝
        2). arr.slice(): 数组浅拷贝
        3). JSON.parse(JSON.stringify(arr/obj)): 数组或对象深拷贝, 但不能处理函数数据
        4). 浅拷贝包含函数数据的对象/数组
        5). 深拷贝包含函数数据的对象/数组
//1.直接赋值 浅度复制
let obj1 = {uname:'kobe', 'sex':'boy'};
let obj2 = obj1;
//2.Object assign 浅度复制assign()第一个参数对象,操作obj3只会影响obj1
let obj1 = {uname:'kobe', 'sex':'boy'};
let obj2 = {age:18};
let obj3 = Object.assign(obj1,obj2);
obj3.uname="wada";
obj3.age=20;
obj3.sex="girl";
//3.Array.prototype.concat()//浅复制 ,
//4.Array.prototype.slice()//浅复制
//5.JSON.pase(JSON.stringify())//深度克隆(深度复制) 但是拷贝的数据里无法拷贝函数

实现深度克隆

    //定义检测类型函数
    function checkType(val){
        return Object.prototype.toString.call(val).slice(8,-1);
    }

    //深度克隆函数
    function clone(obj){
        let result;//最终返回的结果
        let type = checkType(obj);
        if(type==="Object"){
            result={}
        }else if(type==="Array"){
            result=[]
        }else{
            return obj;//如果不是对象或数组 则直接返回
        }
        //数组和对象都可以使用for in
        for(let i in obj){
            let type = checkType(obj[i]);
            if(type==="Object" || type ==="Array"){
                result[i] = clone(obj[i]);
            }else{
                result[i] = obj[i];
            }
        }
        return result;
    }
    let arr = [1,2,3,{name:'kobe',age:18}];
    let arr1 = clone(arr);
    console.log(arr1);
    arr1[3].name="wada";
    console.log(arr,arr1);
上一篇 下一篇

猜你喜欢

热点阅读