美文网首页
深拷贝浅拷贝

深拷贝浅拷贝

作者: 开心就好_635d | 来源:发表于2021-04-06 09:55 被阅读0次

https://www.cnblogs.com/minigrasshopper/p/8746757.html   

这篇文章是转载于上面的链接地址,觉得写的非常好,所以收藏了,感谢原创作者的分享。

浅拷贝和深拷贝都是对于JS中的引用类型而言的,浅拷贝就只是复制对象的引用(堆和栈的关系,简单类型Undefined,Null,Boolean,Number和String是存入堆,直接引用,object array 则是存入桟中,只用一个指针来引用值),如果拷贝后的对象发生变化,原对象也会发生变化。只有深拷贝才是真正地对对象的拷贝。

浅拷贝:浅拷贝的意思就是只复制引用(指针),而未复制真正的值。

深拷贝

深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制了一层引用,就连值也都复制了。

只要进行了深拷贝,它们老死不相往来,谁也不会影响谁。

目前实现深拷贝的方法不多,主要是两种:

        利用JSON对象中的parse和stringify

        利用递归来实现每一层都重新创建对象并赋值

最完备的深拷贝:递归方法-->  就是对每一层的数据都实现一次 创建对象->对象赋值 的操作

function deepClone(source){

  const targetObj = source.constructor === Array ? [] : {}; // 判断复制的目标是数组还是对象

  for(let keys in source){    // 遍历目标   for...in循环对象的所有枚举属性

    if(source.hasOwnProperty(keys)){    //Object的hasOwnProperty()方法返回一个布尔值,判断对象是否包含特定的自身(非继承)属性。

      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;

}

测试下:

const originObj = {a:'a',b:'b',c:[1,2,3],d:{dd:'dd'}};

const cloneObj = deepClone(originObj);

console.log(cloneObj === originObj); // false

cloneObj.a = 'aa';

cloneObj.c = [1,1,1];

cloneObj.d.dd = 'doubled';

console.log(cloneObj); // {a:'aa',b:'b',c:[1,1,1],d:{dd:'doubled'}};

console.log(originObj); // {a:'a',b:'b',c:[1,2,3],d:{dd:'dd'}};

可以。那再试试带有函数的:

const originObj = {

  name:'axuebin',

  sayHello:function(){

    console.log('Hello World');

  }

}

console.log(originObj); // {name: "axuebin", sayHello: ƒ}

const cloneObj = deepClone(originObj);

console.log(cloneObj); // {name: "axuebin", sayHello: ƒ}

也可以。搞定。

相关文章

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • js浅拷贝深拷贝

    js浅拷贝,深拷贝的简单实现 基础数据 浅拷贝 深拷贝

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • iOS--拷贝相关题

    1、什么是深拷贝什么是浅拷贝?浅拷贝和深拷贝的区别 * 浅拷贝(shallow copy):指针拷贝,对于被拷贝对...

  • 2018-10-10day9函数基础

    1.浅拷贝、深拷贝 copy.copy(对象):浅拷贝copy.deepcopy(对象):深拷贝""" """拷贝...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • 深拷贝和浅拷贝

    1.深拷贝:地址的拷贝 2.浅拷贝:是值得拷贝 深拷贝和浅拷贝的区别 A拷贝B B变A变是浅拷贝 A拷贝B B变A...

  • 对象深拷贝和浅拷贝

    浅拷贝 深拷贝 深拷贝的递归方法 深拷贝的JSON方法

网友评论

      本文标题:深拷贝浅拷贝

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