美文网首页
深浅拷贝

深浅拷贝

作者: 写给猫 | 来源:发表于2019-02-27 15:32 被阅读0次

    1 定义

    深拷贝:拷贝一个对象时,不仅把对象的引用进行复制,还把该对象引用的值也一起拷贝。这样得到的深拷贝后的拷贝对象和源对象相互独立。
    浅拷贝:拷贝一个对象时,仅拷贝对象的引用,拷贝对象和源对象还是引用通一份实体。两者的改变相互影响。

    2 js深拷贝

    Object.assign()
    只能实现对一维对象的深拷贝

    var obj1={x:1,y:2};
    var obj2=Object.assign({},obj1);
    obj2.x=2;
    console.log(obj1) //{x: 1, y: 2}
    console.log(obj2) //{x: 2, y: 2}
    

    对多维或一维更深的层次的对象只能进行浅拷贝

    var obj1={
          x:1,
          y:{m:1}
    };
    var obj2=Object.assign({},obj1);
    obj2.y.m=2;
    console.log(obj1) //{x: 1, y: {m: 2}}
    console.log(obj2) //{x: 2, y: {m: 2}}
    

    JSON.parse(JSON.stringify(obj))
    可实现多维对象的深拷贝,但会忽略undefined、任意的函数、symbol 值

    var obj1 = {
        x: 1, 
        y: {
            m: 1
        },
        a:undefined,
        b:function(a,b){
          return a+b
        },
        c:Symbol("foo")
    };
    var obj2 = JSON.parse(JSON.stringify(obj1));
    console.log(obj1) //{x: 1, y: {m: 1}, a: undefined, b: ƒ, c: Symbol(foo)}
    console.log(obj2) //{x: 1, y: {m: 1}}
    obj2.y.m = 2; //修改obj2.y.m
    console.log(obj1) //{x: 1, y: {m: 1}, a: undefined, b: ƒ, c: Symbol(foo)}
    console.log(obj2) //{x: 2, y: {m: 2}}
    

    进行JSON.stringify()序列化的过程中,undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。

    相关文章

      网友评论

          本文标题:深浅拷贝

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