美文网首页
分析:什么是深拷贝?什么是浅拷贝?

分析:什么是深拷贝?什么是浅拷贝?

作者: 沐源山 | 来源:发表于2019-06-28 19:57 被阅读0次

概述

关于深拷贝还是浅拷贝,浅拷贝是指拷贝一层,深层次对象级别就只拷贝引用;深拷贝是每一层的数据都会拷贝出来。简单来说就是浅拷贝的时候如果数据是基本数据类型,那么就如同直接赋值那样,会拷贝其本身;
如果除了基本数据之外还有一层的对象,那么对于浅拷贝来说,就只能拷贝其引用。如果原对象的值发生了变化,那么这个结果不光会反映到原对象上,但是深拷贝就不一样,即使有嵌套关系依然会全部的拷贝出来。
下面上代码:实现浅拷贝的第一种方法

function simpleClone(initalObj) {
    var obj = {};
    for ( var i in initalObj) {
        obj[i] = initalObj[i];
    }
    return obj;
}
 
var obj = {
    a: "hello",
    b:{
        a: "world",
        b: 21
    },
    c:["Bob", "Tom", "Jenny"],
    d:function() {
        alert("hello world");
    }
};
var cloneObj = simpleClone(obj);
 
console.log(cloneObj.a);
console.log(cloneObj.b);
console.log(cloneObj.c);
console.log(cloneObj.d);
 
//更改原对象中的a,b,c,d,看看拷贝过来的对象是否变化
cloneObj.a = "changed";
cloneObj.b.a = "changed";
cloneObj.b.b = 25;
cloneObj.c = [1, 2, 3];
cloneObj.d = function() { alert("changed"); };
console.log(obj.a);    //hello
console.log(obj.b);    //{a:"changed",b:25},事实上就是只有对象是拷贝的引用类型
console.log(obj.c);    //['Bob','Tom','Jenny']
console.log(obj.d);    //...alert("hello world")
返回结果
实现浅拷贝的第二种方法:
在ES6中的Object.assign方法,Object.assign是ES6中的新函数。Object.assign()函数可把任意多的源对象的可枚举属性拷贝给目标对象,然互殴返回目标对象。但是在Object.assign()进行的是浅拷贝,拷贝的是对象的引用,而不是对象的本身。
Object.assign(target, ...sources)
参数:
target:目标对象
sources:任意多个源对象
返回值: 目标对象会被返回
var obj1 = {
    a: "hello",
    b: {
        a: "hello",
        b: 21}
};
 
var cloneObj1= Object.assign({}, obj1);
cloneObj1.a = "changed";
cloneObj1.b.a = "changed";
console.log(obj1.a);  //hello
console.log(obj.b.a); // "changed"

浅拷贝说完了,我们来看看如何才能实现深拷贝:
1.使用JSON数据解析来实现深拷贝。

            var obj1 = {
                a: 10,
                b: {
                    a: 'yf',
                    b: 'bl'
                },
                c: ['Bob','Tom','nick'],
                d: function(){
                    console.log('Hello World');
                }
            };
        function deepClone(obj){
            return JSON.parse(JSON.stringify(obj));
        }
        var e = deepClone(obj1);
        e.a = 20;
        console.log(e);
        console.log(obj1);
        // 通过类型检测判断JSON是不识别Function类型的
        console.log(typeof e.d);
        console.log(typeof obj1.d);

在使用JSON的时候要注意的是,使用JSON数据解析来实现深度拷贝(JSON不能够识别Function类型);

输出结果
使用JSON数据解析这种方式我们还是能够理解的,我们使用JSON.stringify将其转化为JSON字符串,这个时候重新生成的字符串和原来的对象是没有任何关系的,也就是说为字符串重新开辟了一个新的储存空间;
之后我们通过反序列化进行转成对象,用JSON.parse将其转化为对象,此时在新旧对象上的操作是彼此独立,互不干扰的。
但是这种方法也是有自己的缺点,这种方法存在一个致命性的错误,不能够识别对象中的Function类型,JSON.stringify()不能够识别Function,会返回undefined,所以这个方法只能用于只有数据的对象中。这个方法会抛弃对象的constructor,深拷贝之后,不管对象的构造函数是什么,都会将其变成Object
这种深拷贝的方法比较有局限性,那么为了解决这一办法,我们就用第二种方法,递归方法实现深拷贝。

递归方法实现深度拷贝

    function deepClone(Obj1, Obj2) {    
            var obj = Obj2 || {};    
            for (var i in Obj1) {        
                var prop = Obj1[i]; 
                // 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
                if(prop === obj) {            
                continue;
            }        
            if (typeof prop === 'object') {
                obj[i] = (prop.constructor === Array) ? [] : {};            
                arguments.callee(prop, obj[i]);
            } else {
                obj[i] = prop;
            }
        }    
        return obj;
    }
    var str = {};
    var obj = { a: {a: "hello", b: 21, c: function(){alert('hello world');}}};
    deepClone(obj, str);
    console.log(str.a);
浏览器返回结果

通过上面的方法,我们补全了JSON不能对Function使用的缺点。

总结

浅拷贝就是两个对象引用的是同一个的内存空间,一个改变全部改变。
深拷贝就是两个对象,旧对象还是用原来的储存空间。但是新对象就不同了,新对象自己开辟了一个新的空间,自己对自己控制,不再受原来空间的限制。


参考

https://blog.csdn.net/rememberyf/article/details/82841224

文中如有错误,望读者斧正。共同学习,共同进步。

相关文章

  • iOS--拷贝相关题

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

  • js浅拷贝、深拷贝

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

  • Object 对象

    什么是浅拷贝,如何实现浅拷贝?什么是深拷贝,如何实现深拷贝? 是什么: 浅拷贝: 将原对象或原数组的引用直接赋给新...

  • 分析:什么是深拷贝?什么是浅拷贝?

    概述 关于深拷贝还是浅拷贝,浅拷贝是指拷贝一层,深层次对象级别就只拷贝引用;深拷贝是每一层的数据都会拷贝出来。简单...

  • 深拷贝、浅拷贝的理解与使用场景

    什么是深拷贝、浅拷贝? 通俗解释:深拷贝是内容拷贝,浅拷贝是地址拷贝 区别点: 深拷贝会创建一个新的内存空间,拷贝...

  • python切片是引用还是复制

    切片是深拷贝 等号是引用,不是拷贝 深拷贝、浅拷贝都属于拷贝,改变原始列表拷贝列表通常不变,为什么说深、浅呢?是指...

  • 重拾iOS-copy

    关键词: , , , , 面试题:1)什么是深拷贝什么是浅拷贝?2)对可变对象进行copy是深拷贝还是浅拷贝?3)...

  • Java基础 - 深拷贝和浅拷贝

    Java 的深拷贝和浅拷贝 什么是深拷贝、浅拷贝 (深克隆、浅克隆)? 在 Java 中,数据类型分为 基本数据类...

  • 什么是浅拷贝?什么是深拷贝?

    解决这个问题的前提是:了解过js的变量存储类型、赋值。 懂的就跳过 ============== 变量存储类型分两...

  • 什么是浅拷贝与深拷贝

    什么是浅拷贝与深拷贝。浅拷贝就是不可变对象执行不可变拷贝(copy)深拷贝就是如果执行拷贝时 只要有可变的无论是可...

网友评论

      本文标题:分析:什么是深拷贝?什么是浅拷贝?

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