js中的深拷贝和浅拷贝

作者: 米若晨风 | 来源:发表于2019-04-03 22:24 被阅读4次

    一、基本数据类型

    1. 占用内存大小固定,存在栈内存中,在被复制时,复制的是值,修改被复制的变量,原变量并不会受到影响。
    var a= 1;
    var b= a;
    b = 3;
    console.log(a, b);   //1    3
    

    二、引用数据类型

    1. 引用数据类型的值是对象,存在堆内存上,引用类型的变量实际上存的是指针,指向堆上的对象,在复制时,复制的是指针,修改其中一个变量,另一个也会被改变。

    var A= {a:1};
    var B= A;
    B.a = 3;
    console.log(A.a, B.a);  //3   3
    

    以上就是浅拷贝

    2. 怎样深拷贝,使拷贝后变量间不影响

    a. 数组用slice、concat解决,返回新数组

    var arr = [0,1,2];
    var copyArr = arr.concat();
    copyArr[0] = 100;
    console.log(copyArr[0], arr[0]);    //100  0
    

    b. 对象,

    按照实现原理,遍历源对象的每个属性,拷贝给新对象的属性*

    var obj = {name:'a', age: 20};
    var newObj = new Object();
    newObj.name = obj.name;  
    newObj. age = obj. age;  
    newObj.name = 'c';
    console.log(obj, newObj );      //{name: "a", age: 20} {name: "c", age: 20}
    

    实现方法:

    function deepCopy(source){
      var result = {};
      for(let key in source){
          if(typeof source[key] === object){
              deepCopy(source[key])
        }else{ result[key] =source[key] }
      }
    }
    

    js提供的方法:Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

    const target = { a: 1, b: 2 };
    const source = { b: 4, c: 5 };
    const returnedTarget = Object.assign(target, source);
    console.log(returnedTarget, target, source);  //{a: 1, b: 4, c: 5} {a: 1, b: 4, c: 5} {b: 4, c: 5}
    

    相关文章

      网友评论

        本文标题:js中的深拷贝和浅拷贝

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