资讯专栏INFORMATION COLUMN

JS中的浅拷贝和深拷贝

xeblog / 980人阅读

摘要:说明外层数组拷贝的是实例说明元素拷贝是引用深拷贝在堆中重新分配内存,并且把源对象所有属性都进行新建拷贝,拷贝后的对象与原来的对象完全隔离,互不影响。中的方法可以实现深拷贝,源码原理也是递归使用浅拷贝。

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和其本身)。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88336.html

相关文章

  • JavaScript的浅拷贝和深拷贝

    摘要:在中可以通过添加一个参数来实现递归,调用就可以实现一个深拷贝。利用序列化实现一个深拷贝 在JavaScript中,对于Object和Array这类引用类型值,当从一个变量向另一个变量复制引用类型值时,这个值的副本其实是一个指针,两个变量指向同一个堆对象,改变其中一个变量,另一个也会受到影响。 这种拷贝分为两种情况:拷贝引用和拷贝实例,也就是我们说的浅拷贝和深拷贝 浅拷贝(shallow...

    ernest.wang 评论0 收藏0
  • 实现JS的浅拷贝和深拷贝

    摘要:浅拷贝和浅拷贝的问题,不仅在日常应用中需要注意,而且在面试和笔试中也常被用来考察应聘者,属于文体两开花的。基本数据类型引用数据类型等等基本数据类型是按值访问的,对其的拷贝会直接复制其值保存在新变量中。方法手工遍历法方法方法方法方法 浅拷贝和浅拷贝的问题,不仅在日常应用中需要注意,而且在面试和笔试中也常被用来考察应聘者,属于文体两开花的points。 什么是深拷贝和浅拷贝呢? 名称 ...

    huangjinnan 评论0 收藏0
  • js的浅拷贝和深拷贝

    摘要:拷贝分为浅拷贝和深拷贝。浅拷贝是引用复制,深拷贝是完全单纯拷贝数据的值。所以,这种方法只是简单绕过第一层箱子的引用复制深拷贝目前比较好的方法就是大法,要么就是自己写递归的深拷贝函数。附带深拷贝的自定义函数源自大佬的 经常遇到数组或对象等引用类型作为函数的参数的情况,但又不想修改原来的数据,这时候就需要拷贝(基本类型的变量不需要考虑)。拷贝分为浅拷贝和深拷贝。浅拷贝是引用复制,深拷贝是完...

    jsliang 评论0 收藏0
  • js的浅拷贝和深拷贝和应用场景

    摘要:而大多数实际项目中,我们想要的结果是两个变量初始值相同互不影响。所以就要使用到拷贝分为深浅两种深浅拷贝的区别浅拷贝只复制一层对象的属性,而深拷贝则递归复制了所有层级。 为什么会用到浅拷贝和深拷贝 首先来看一下如下代码 let a = b = 2 a = 3 console.log(a) console.log(b) let c = d = [1,2,3] let e = f = {a:...

    MartinDai 评论0 收藏0
  • js的浅拷贝和深拷贝和应用场景

    摘要:而大多数实际项目中,我们想要的结果是两个变量初始值相同互不影响。所以就要使用到拷贝分为深浅两种深浅拷贝的区别浅拷贝只复制一层对象的属性,而深拷贝则递归复制了所有层级。 为什么会用到浅拷贝和深拷贝 首先来看一下如下代码 let a = b = 2 a = 3 console.log(a) console.log(b) let c = d = [1,2,3] let e = f = {a:...

    nemo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<