美文网首页
对象深拷贝理解

对象深拷贝理解

作者: 等花开_8e16 | 来源:发表于2018-06-12 20:48 被阅读0次

先读一篇这样的文章扫盲来告诉我们为什么js会出现对象深拷贝的问题,

https://www.jb51.net/article/91053.htm

接下来就是一些实现深拷贝的方法了:

1.数组的深拷贝(es6)
方法1:

var arr1=[1,2,3];
var arr2=Array.from(arr1);
arr1.push(4);
console.log(arr1);  //1234
console.log(arr2);  //123
arr2.push(5);
console.log(arr1);  //1234
console.log(arr2);  //1235

方法2:

var arr1=[1,2,3];
var arr2=[...arr1];
arr1.push(4);
console.log(arr1);  //1234
console.log(arr2);  //123
arr2.push(5);
console.log(arr1);  //1234
console.log(arr2);  //1235

2.下面是对象深拷贝的方法
方法1:

var obj = {a:1,b:2,c:3};
var cpobj = JSON.parse(JSON.stringify(obj));
cpobj.a = "m";
console.log(obj);//{ a: 1, b: 2, c: 3 }
console.log(cpobj);//{ a: 'm', b: 2, c: 3 }

上述方法可以进行对象的拷贝但是却存在问题,如果对象的属性是函数的话,拷贝得到的对象中不会有这个属性,因此还是需要乖乖的进行递归拷贝,以下代码是借用CSDN上的一篇文章讲解的方法,链接如下:
https://blog.csdn.net/sysuzhyupeng/article/details/70340598
代码如下:

function getType(obj){
       //tostring会返回对应不同的标签的构造函数
       var toString = Object.prototype.toString;
       var map = {
          '[object Boolean]'  : 'boolean', 
          '[object Number]'   : 'number', 
          '[object String]'   : 'string', 
          '[object Function]' : 'function', 
          '[object Array]'    : 'array', 
          '[object Date]'     : 'date', 
          '[object RegExp]'   : 'regExp', 
          '[object Undefined]': 'undefined',
          '[object Null]'     : 'null', 
          '[object Object]'   : 'object'
      };
      if(obj instanceof Element) {
           return 'element';
      }
      return map[toString.call(obj)];
   }
  
function deepClone(data){
       var type = getType(data);
       var obj;
       if(type === 'array'){
           obj = [];
       } else if(type === 'object'){
           obj = {};
       } else {
           //不再具有下一层次
           return data;
       }
       if(type === 'array'){
           for(var i = 0, len = data.length; i < len; i++){
               obj.push(deepClone(data[i]));
           }
       } else if(type === 'object'){
           for(var key in data){
               obj[key] = deepClone(data[key]);
           }
       }
       return obj;
   }
  

以上代码完善简洁,在此记录一下

相关文章

  • 深浅拷贝,面向对象,Symbol,Set,Map

    一:浅拷贝与深拷贝对象的浅拷贝:浅拷贝是对象共用的一个内存地址,对象的变化相互影响。对象的深拷贝:简单理解深拷贝是...

  • IOS开发之深拷贝与浅拷贝

    拷贝的方式有两种:浅拷贝和深拷贝。 从字面意思理解,浅拷贝,只是拷贝了对象的指针,而不是拷贝对象本身。 深拷贝,是...

  • 对象深拷贝理解

    先读一篇这样的文章扫盲来告诉我们为什么js会出现对象深拷贝的问题, https://www.jb51.net/ar...

  • 拷贝

    .深拷贝 深拷贝是对于一个对象所有层次的拷贝(递归) .浅拷贝 浅拷贝是对一个对象的顶层拷贝通俗的理解就是:拷贝了...

  • iOS 简单理解---浅拷贝,深拷贝

    浅拷贝,深拷贝。 1、个人简单理解就是: 浅拷贝没有创建新对象,深拷贝创建新的对象 从输出结果可以看出:1:不管是...

  • iOS 面试解析|对深浅拷贝的理解

    对深浅拷贝的理解 我们先要理解拷贝的目的:产生一个副本对象,跟源对象互不影响。 深拷贝和浅拷贝的区别 拷贝类型拷贝...

  • Python深、浅拷贝解析

    内容纯属个人理解,不对之处,欢迎指点。 深、浅拷贝的定义 深拷贝:对一个对象的所有层次的递归拷贝浅拷贝:对一个对象...

  • 手写深拷贝

    手写深拷贝 深拷贝 深拷贝简单理解就是b是a的一份拷贝,且b中不存在a中对象的引用 深拷贝的实现 1.JSON序列...

  • 2018-10-10函数基础

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

  • 2018-07-29

    1、浅拷贝* 浅拷贝是对一个对象的顶层拷贝* 通俗的理解就是:拷贝了引用,并没有拷贝内容 2、深拷贝* 深拷贝是对...

网友评论

      本文标题:对象深拷贝理解

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