JS中的浅拷贝和深拷贝

发布时间:2019-08-20 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了JS中的浅拷贝和深拷贝脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

1.浅拷贝

当把数组或对象简单赋值给其他变量的时候,实际上进行的是浅拷贝,浅拷贝是拷贝引用,只是将拷贝后的引用指向同一个对象实例,彼此间的操作还会互相影响。

分为两种情况:
直接拷贝对象的引用

VAR a = { c : 1};
var b = a ;
console.LOG( a === b);    // true
 a.c = 2 ;
console.log( b.c ); // 2

源对象拷贝实例,但其属性拷贝引用。

var a = [{ c:1 },{d:2} ];
var b = a.slice( );
console.log( a === b ); // false 说明外层数组拷贝的是实例
a[0].c = 3;
console.log( b[0].c ); // 3 //说明元素拷贝是引用

2.深拷贝

在堆中重新分配内存,并且把源对象所有属性都进行新建拷贝,拷贝后的对象与原来的对象完全隔离,互不影响
如何实现深拷贝?只要递归调用“浅拷贝”就行了。

function deepCopy( p , c ){
    var c = c || {} ;
    for(var i in p){
        If( tyPEof p[ i ] === “object” ){
            c[ i ] = ( p[ i ].constructor === Array )? [ ] : { };
            deepCopy(p[ i ], c[ i ]);
        }else{
            c[ i ] = p[ i ];
        }
    }

    return c;
}

jquery中的$.extend( )方法可以实现深拷贝,源码原理也是递归使用浅拷贝。
注意ES6的新方法Object.assign( target , obj )实现的是浅拷贝。

3.javascript判断对象是否相等 “==“ ,”==="

对象和数组这种复杂数据类型在判断是否相等时,判断的是二者指向的内存地址是否一致,并不是以是否有相同的属性,属性是否有相同的值为标准。

如,

       var obj1 = {name : ‘Mack’, age : 21};
       var obj2 = {name : ‘Mack’, age : 21};

       console.log(obj1 === obj2); //false
        
       var obj3 = obj1;

       console.log(obj1 === obj3); //true

ES6中的Object.is( )在复杂数据类型的判断机制上和 ‘===’ 是一样的(不同之处只有两个,一个是 +0和-0,第二个是NaN和其本身)。

脚本宝典总结

以上是脚本宝典为你收集整理的JS中的浅拷贝和深拷贝全部内容,希望文章能够帮你解决JS中的浅拷贝和深拷贝所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。