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

深拷贝和浅拷贝

作者: 羊烊羴 | 来源:发表于2017-10-19 19:42 被阅读0次

在Vue官方文档看到了利用JSON.parse和JSON.stringify实现深拷贝,这里顺便说一下

所谓的深拷贝和浅拷贝的区别在于同样是复制某个对象和数组,但是浅拷贝只是将各个对象进行依次赋值,由于javascript存储对象都是对内存堆中地址的引用,所以浅拷贝最后实际上新的对象的变量的值还是引用了原来对象的值的地址,所以如果我们改变原来对象属性的值,那么新对象的值也会被改变,下面是一个浅拷贝的栗子

var obj={a:1,arr:[2,3]};
    var newObj=shallowCopy(obj);

    function shallowCopy(src) {
        var obj={};
        for(var key in src){
            if(src.hasOwnProperty(key)){
                obj[key]=src[key]
            }
        }
        return obj;
    }

    obj.arr[1]=4;
    console.log(newObj.arr[1]) //4  所以很明显newObj还是和obj指向同一个地址

深拷贝则不同,深拷贝会递归复制原对象的每一个值,然后独立组成一个新的对象,同时也会在内存中开辟一块新的空间,但是需要注意的是由于深拷贝是递归复制,所以可能会影响性能,而且一般不会使用深拷贝,下面举几个实现深拷贝的栗子

<script>
    //jq方法$.extend(),第一个参数可选,如果为true,那么表示深拷贝,如果不传值表示浅拷贝
    var obj={a:1,arr:[2,3]};
    $.extend(true, obj)
    //js clone方法
    var clone=function (obj) {
        var key,newObj=Object.prototype.toString.call(obj)=="[object Object]"?[]:{};
        if(Object.prototype.toString.call(obj) !="[object Object]"){
            return;
        }else if(window.JSON){
            newObj=JSON.parse(JSON.stringify(obj))
        }else{
            for( key in obj){
                newObj[key]=typeof obj[key] =='object'?clone(obj[key]):obj[key]
            }
        }
        return newObj;
    }
</script>

相关文章

  • 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/gcepuxtx.html