美文网首页
浅拷贝和深拷贝

浅拷贝和深拷贝

作者: 瓜田猹 | 来源:发表于2018-09-05 11:29 被阅读12次

一、ECMAScript数据类型

1)基本数据类型:简单的数据段(Number、String 、Boolean、Null和Undefined)
2)引用数据类型:多个值构成的对象(Object 、Array 、Function等)

二、变量的复制

1)原始值:将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已(且一个变量的改变不会影响另一个变量)。

2)引用值:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。(这里要理解的一点就是,复制对象时并不会在堆内存中新生成一个一模一样的对象,只是在栈内存多了一个指向这个对象指针罢了)

三、深复制和浅复制

浅拷贝: 浅拷贝就是流于表面的拷贝方式;当属性值为对象类型时,只拷贝了对象数据的引用(指针),导致新旧数据没有完全分离,还会互相影响。
深拷贝:深拷贝就是 ‘完全’拷贝,拷贝之后新旧数据完全分离,不再共用对象类型的属性值,不会互相影响

四、如何实现对象、数组的深拷贝

1)方法一

JSON.parse(JSON.stringify(Obj))
注意:这种方式不能深拷贝有属性值为函数的对象

1)方法二

   function deepCopy(target){
       if(typeof target!=='object')return;
           var newObj = target instanceof Array?[]:{};
           for(var item in target){
          //只复制元素自身属性,不复制原型链上的
           if(target.hasOwnProperty(item)){
              newObj[item] = typeof target[item]=='object'?  deepCopy(target[item]):target[item]//是对象就把对象属性拆分出来赋值
            }
        }
        return newObj;
    }
    var test = [1,'a',{name:'lei',age:18}];
    var copy2 = deepCopy(test);
    copy2[2].name = 'zhang';
    console.log(test);// [1,'a',{name:'lei',age:18}];
    console.log(copy2);// [1,'a',{name:'zhang',age:18}];

五、Object.assign()

用来复制一个对象

  Object.assign({}, obj)

注意:Object.assign() 只是一级属性复制,比浅拷贝多深拷贝了一层而已
针对深拷贝,需要使用其他方法,因为 Object.assign()拷贝的是属性值。假如源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。

//可使用此方法拷贝(一级属性)
 let obj1 = { a: 0 , b: 1};
 let obj2 = Object.assign({}, obj1);  
 obj2.a = 1;
 console.log(JSON.stringify(obj1)); // { a: 0, b:1}
 console.log(JSON.stringify(obj2)); // { a: 1, b:1}
//不可使用此方法拷贝(多级属性)
 let obj1 = { a: 0 , b: { c: 0}};
 let obj2 = Object.assign({}, obj1);  
 obj2.b.c = 3;
 console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}}
 console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}//都改变了

参考:
https://www.cnblogs.com/cxying93/p/6106469.html
https://blog.csdn.net/u011277123/article/details/78376487

相关文章

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

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

  • iOS面试题-第二页

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

  • iOS - copy 与 mutableCopy

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

  • JS中的深拷贝与浅拷贝

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

  • iOS--拷贝相关题

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

  • copy和mutableCopy的区别

    copy和mutableCopy的区别 深拷贝和浅拷贝的区别 在OC中对象的拷贝方式有两种:深拷贝和浅拷贝.浅拷贝...

  • 2018-10-10函数基础

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

  • Objective-C中的浅拷贝和深拷贝

    Objective-C中的浅拷贝和深拷贝 Objective-C中的浅拷贝和深拷贝

  • JavaScript的深拷贝和浅拷贝

    原文 博客原文 大纲 前言1、对深拷贝和浅拷贝的初步认识2、深拷贝和浅拷贝的区别3、浅拷贝存在的缺陷4、深拷贝的实...

  • java中的深拷贝和浅拷贝

    简单记录一下java中的深拷贝和浅拷贝,深拷贝和浅拷贝只是针对对象而言的. 1 深拷贝代码 2 浅拷贝代码 3 测...

网友评论

      本文标题:浅拷贝和深拷贝

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