资讯专栏INFORMATION COLUMN

深拷贝和浅拷贝

Kross / 746人阅读

摘要:只有对于复杂数据类型才有深浅拷贝一说粗浅的解释浅拷贝并不是真的拷贝,新对象仍指向原被拷贝对象的内存地址,如有更新会被同步引用数据类型的名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值深拷贝是完全拷贝出了独立的

只有对于Object(复杂数据类型)才有深浅拷贝一说

1、粗浅的解释:

浅拷贝并不是真的拷贝,新对象仍指向原被拷贝对象的内存地址,如有更新会被同步

(引用数据类型(Object)的名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值)

深拷贝是完全拷贝出了独立的对象,一毛一样

2、怎样实现深拷贝 递归方式
function deepClone(obj){
    let objClone = Array.isArray(obj)?[]:{}; 
    // 判断是否为引用类型数据
    if(obj && typeof obj==="object"){
        for(key in obj){
            if(obj.hasOwnProperty(key)){
                //判断ojb子元素是否为对象,如果是,递归复制
                if(obj[key]&&typeof obj[key] ==="object"){
                    objClone[key] = deepClone(obj[key]);
                }else{
                    //如果不是,简单复制
                    objClone[key] = obj[key];
                }
            }
        }
    }
    return objClone;
}    
let a=[1,2,3,4],
    b=deepClone(a);
a[0]=2;
console.log(a,b);    // 2234 1234
extend(jQuery方法)

$.extend( [ deep ], target, object1 [, objectN ] )
deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝

let a=[0,1,[2,3],4],
    b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
借用JSON对象的parse和stringify

利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象;序列化的作用是存储(对象本身存储的只是一个地址映射,如果断电,对象将不复存在,因此需将对象的内容转换成字符串的形式再保存在磁盘上 )和传输(例如 如果请求的Content-Type是 application/x-www-form-urlencoded,则前端这边需要使用qs.stringify(data)来序列化参数再传给后端,否则后端接受不到)

function deepClone(obj){
    let _obj = JSON.stringify(obj),
        objClone = JSON.parse(_obj);
    return objClone
}    
let a=[0,1,[2,3],4],
    b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);  

使用JSON做深拷贝时,被拷贝对象内如果有date、RegExp或者是function会出现一些问题
不懂的时候看看这个

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

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

相关文章

  • JS里拷贝和浅拷贝的释义

    摘要:本文解释中深拷贝和浅拷贝的区别。深拷贝深拷贝指递归的复制对象的属性给新对象。有些时候一层的深拷贝被认为是浅拷贝,比如的值是一个对象,浅拷贝出来的新对象直接引用了原对象的对象,所以也会相互影响的。 本文解释javascript中深拷贝和浅拷贝的区别。 浅拷贝/Shallow Copy 浅拷贝指拷贝了引用值。 var original = {prop1 : Prop1, prop2 : p...

    zollero 评论0 收藏0
  • 拷贝和浅拷贝的区别

    摘要:深拷贝和浅拷贝的区别背景最近在用框架写页面,赋值给中的对象时会出现一个问题,赋值和被赋值对象之中任何一个有变化,另一个也会随之变化。 深拷贝和浅拷贝的区别 背景:最近在用vue框架写页面,赋值给Vue.$data中的对象时会出现一个问题,赋值和被赋值对象之中任何一个有变化,另一个也会随之变化。例如: var b = { foo: 123 }; var vm = new Vue(...

    suemi 评论0 收藏0
  • js拷贝和浅拷贝

    摘要:深拷贝和浅拷贝深拷贝和浅拷贝的示意图大致如下浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。参考文章什么是深拷贝和浅拷贝及其实现方式 走在前端的大道上 本篇将自己读过的相关文章中,对自己有启发的章节片段总结在这(会对原文进行删改),会不断丰富提炼总结更新。 浅拷贝 var m = { a: 10, b: 20 } var n = m; n.a = 15; ...

    MAX_zuo 评论0 收藏0
  • 拷贝和浅拷贝的全面理解

    摘要:关于深拷贝和浅拷贝从原理看浅拷贝拷贝一层,对象级别的则拷贝引用深拷贝拷贝多层,每个层级的属性都会拷贝从现象看复制了,被修改后,随变化而变化浅拷贝不变深拷贝深拷贝针对的复杂的类型数据如直接赋值的单层拷贝,如,虽然不受的影响,但是这也不算做 关于深拷贝和浅拷贝 从原理看: 浅拷贝:拷贝一层,对象级别的则拷贝引用 深拷贝:拷贝多层,每个层级的属性都会拷贝 从现象看:A复制了B,B被修改后...

    _DangJin 评论0 收藏0
  • 探索php和python下对象的拷贝和浅拷贝

    摘要:对于而言,情况可能会有点小复杂,因为一切皆为对象,所以的普通赋值深拷贝和浅拷贝之间都是有细微区别的。二下的他们在中,对象的赋值和传递都是引用。 一、深拷贝与浅拷贝   深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个   浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个   对于PHP而言,= 赋值时,普通对象是深拷贝,但对对象来说...

    shinezejian 评论0 收藏0
  • 探索php和python下对象的拷贝和浅拷贝

    摘要:对于而言,情况可能会有点小复杂,因为一切皆为对象,所以的普通赋值深拷贝和浅拷贝之间都是有细微区别的。二下的他们在中,对象的赋值和传递都是引用。 一、深拷贝与浅拷贝   深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个   浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个   对于PHP而言,= 赋值时,普通对象是深拷贝,但对对象来说...

    wizChen 评论0 收藏0

发表评论

0条评论

Kross

|高级讲师

TA的文章

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