美文网首页
深浅拷贝

深浅拷贝

作者: YellowPoint | 来源:发表于2019-02-22 14:18 被阅读0次

深浅拷贝针对的是 对象类型,如果是字符串的数组用[...arr],还是不会影响

要区分针对数组的深浅拷贝(默认情况为里面没有对象的数组),与针对对象的深浅拷贝

JavaScript数组深拷贝和浅拷贝的两种方法

let a1 = [1, 2];
let a2 = a1;

a2[0] = 2;
a1 // [2, 2]
这个是复制了指向底层数据结构的指针
--

let a1 = [1, 2];
let a2 = [...a1];
这个是a1会返回原数组的克隆,再修改a2就不会对a1产生影响
--

let a1 = [{foo:1}];
let a2 = [...a1];
a1[0].foo=2
a2[0].foo ===>2
这时a1数组里是对象,a2克隆过去的话,对象里的值还是会随着修改


深拷贝普遍的方法是对对象的子对象进行递归拷贝
// 递归实现一个深拷贝
function deepClone(source){
   if(!source || typeof source !== 'object'){
     throw new Error('error arguments', 'shallowClone');
   }
   var targetObj = source.constructor === Array ? [] : {};
   for(var keys in source){
      if(source.hasOwnProperty(keys)){
         if(source[keys] && typeof source[keys] === 'object'){
           targetObj[keys] = source[keys].constructor === Array ? [] : {};
           targetObj[keys] = deepClone(source[keys]);
         }else{
           targetObj[keys] = source[keys];
         }
      } 
   }
   return targetObj;
}


有一个用JSON对象中的parse和stringify来实现深拷贝
但是源对象的方法在拷贝的过程中丢失了,这是因为在序列化JavaScript对象时,所有函数和原型成员会被有意忽略

// 利用JSON序列化实现一个深拷贝
function deepClone(source){
  return JSON.parse(JSON.stringify(source));
}
var o1 = {
  arr: [1, 2, 3],
  obj: {
    key: 'value'
  },
  func: function(){
    return 1;
  }
};
var o2 = deepClone(o1);
console.log(o2); // => {arr: [1,2,3], obj: {key: 'value'}}


js 深拷贝 vs 浅拷贝 思维导图

image

对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没 有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变,而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。深复制实现代码如下:
第一种方法、通过递归解析解决
第二种方法:通过JSON解析解决
作者:六师兄Leon
链接:https://www.zhihu.com/question/23031215/answer/124017500


JavaScript 原生js深拷贝的实现

function deepCopy(initalObject,finalObject){
  var finalObject = finalObject || {} 
  // 处理未输入新对象的情况
  for(var key in initalObject){
    if(initalObject[key] === initalObject){
      continue
    }
    if(typeof initalObject[key] === "object"){
      finalObject[key] = (initalObject[key].constructor === Array) ? [] : Object.create(initalObject[key])  //通过Object.create()方法构造新的对象
    }else{
      finalObject[key] = initalObject[key]
    }
  }
  return finalObject
}

header 1 header 2
row 1 col 1 row 1 col 2
row 2 col 1 row 2 col 2

相关文章

  • 2018-08-29

    深浅拷贝 1.根据拷贝内容的不同,分为深浅拷贝 深拷贝:内容...

  • js的深浅拷贝

    js的深浅拷贝可以分为数组的深浅拷贝和对象的深浅拷贝 一、数组的深浅拷贝如果只是简单的将数组中的元素付给另外一个数...

  • Python—浅拷贝与深拷贝

    浅拷贝 深拷贝 深浅拷贝的作用

  • 深浅拷贝

    先来了解一下这些:在js中变量类型基本分为两种:基本数据类型和引用数据类型;基本类型:Underfied Null...

  • 深浅拷贝

    浅拷贝是对一个对象的顶层拷贝。通俗的理解就是:拷贝了引用,并没有拷贝内容。 深拷贝是对于一个对象所有层次的拷贝(递...

  • 深浅拷贝

    深浅拷贝.copy 浅拷贝 这是一个方法,浅拷贝修改可变类型是会将原数据也一块修改 Copy.deepcopy 深...

  • 深浅拷贝

    1:is 和 ==的区别 is 是比较两个引用是否指向了同一个对象(地址引用比较)。== 是比较两个对象是否相等。...

  • 深浅拷贝

    函数的传递,与matlab不同,具有以下特点: 1.直接赋值会带来不同ID,例如,a=2,b=2 2.传递引用赋值...

  • 深浅拷贝

    最近一直被问到深浅拷贝的问题。自己也确实不太清楚怎么回事,现在来研究一下。 什么是深浅拷贝 浅拷贝:指针拷贝,不会...

  • 深浅拷贝

    概念: 浅复制:不拷贝对象本身,仅仅是拷贝指向对象的指针深复制:是直接拷贝整个对象内存到另一块内存中 注意:这里有...

网友评论

      本文标题:深浅拷贝

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