美文网首页
Js浅拷贝以及深拷贝

Js浅拷贝以及深拷贝

作者: zsyyyyy | 来源:发表于2019-05-18 18:52 被阅读0次

浅拷贝的实现原理:
浅拷贝只会复制对象的指针,而不是复制对象本身,指针指向同一内存,新旧对象还是共享同一块内存,
所以当复制一份过来,如 var obj2 = obj1;改变obj2的里面的属性,obj1也会随着改变。
如图:


13253432-aca35e0020358b3d.jpg

下面来个例子:

<script type="text/javascript">
        var obj = {
            a:1
        }
        console.log(a.a) //1
        var obj2 = obj;//复制obj1
        obj2.a=2;
        console.log(obj.a);//2  obj1里的a也会改变
    </script>

深拷贝:它会创造出一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象
下面来个例子:

//创建一个对象
var obj = {
    name:"小明",
    age:"12",
    skill:function(){
        console.log("123")
    },
   arr:["1","2","3"]
}

方式一:缺点:不能复制函数
var   objStr = JSON.stringify(obj);//先将对象转为字符串
var newObj = JSON. parse(objStr);//再将转的字符串转为obj对象
console.log(newObj);

运行结果如下:


3e5577b2f615b1e58460f1cfc118d82.png

从运行结果的到,通过JSON.stringify(),与JSON.parse()进行深拷贝,不能复制方法。

方式二
//创建一个对象
var obj = {
    name:"小明",
    age:"12",
    skill:function(){
       console.log("123")
    },
   arr:["1","2","3"]
}
//首先创建一个空的对象,来装复制出来的对象
var newObj = {};
    function deepcopy(obj,newObj){
         for(var i  in  obj){  //for...in遍历对象 i为键名
          if (typeof obj[i]==="object"){//判断这个属性是否对象 ===
             //判断这个obj[i]为数组还是对象
             newObj[i] = Array.isArray(obj[i])?[] :{};//newObj.arr = [] || {}   ,如果是数组或者对象,再创建一个空的数组或者对象装里面的元素或者键值对,
             deepcopy(obj[i],newObj[i]);//然后再调用函数自己,用递归把数组或者数组中的每一个元素遍历出来
         }else{
           // newObj.name=小明
            newObj[i] = obj[i];//把原对象的键值对复制给新对象
          }
      }
     return newObj ;
   }
   var res = deepcopy(obj,newObj);//调用函数
   console.log(res);

   res.skill = function(){//改变新对象的方法,原对象方法不会随着改变
    console.log("9999");
   }
  obj.skill();
  res.skill();
  res.arr[0] = "888";//改变新对象的属性,原对象属性不会随着改变
  console.log(obj.arr);
  console.log(res.arr);

var res = deepCopy(obj,newObj);//调用函数
console.log(res);
结果如图:


eb830c4d8ef09cf322fdfc1cd47acfe.png

相关文章

  • JS中的深拷贝与浅拷贝

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

  • js浅拷贝深拷贝

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

  • 浅拷贝和深拷贝

    本文参考:JavaScript中的浅拷贝和深拷贝js 深拷贝 vs 浅拷贝深入剖析 JavaScript 的深复制...

  • Js浅拷贝以及深拷贝

    浅拷贝的实现原理:浅拷贝只会复制对象的指针,而不是复制对象本身,指针指向同一内存,新旧对象还是共享同一块内存,所以...

  • JS实现深拷贝、instanceof、判断是否为数组

    JS深拷贝 JS中拷贝对象可以按照拷贝的程度可以分为浅拷贝和深拷贝,有些时候我们需要拷贝之后的对象和拷贝之前的对象...

  • js浅拷贝、深拷贝

    前言 本文主要简单讲一下什么是浅拷贝、什么是深拷贝、深拷贝与浅拷贝的区别,以及怎么进行深拷贝和怎么进行浅拷贝。 一...

  • JS中对象的复制

    JS中的对象复制分为两种情况:深拷贝和浅拷贝。深拷贝和浅拷贝的区别在于对数组和对象的拷贝,对它们拷贝时浅拷贝只是拷...

  • js 深拷贝 vs 浅拷贝(本篇博客摘抄子掘金‘sunshine

    链接本文主要讲一下 js 的基本数据类型以及一些堆和栈的知识和什么是深拷贝、什么是浅拷贝、深拷贝与浅拷贝的区别,以...

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

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

  • 2020前端高频面试题总结(附答案)

    [ js基础题 ] 1. new的实现原理是什么? 2. 深拷贝和浅拷贝的区别是什么 深拷贝 浅拷贝 3. bin...

网友评论

      本文标题:Js浅拷贝以及深拷贝

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