欢迎光临散文网 会员登陆 & 注册

深拷贝和浅拷贝

2022-10-21 14:59 作者:对白浅浅  | 我要投稿


// a = 基础数据类型 或 复杂数据类型

// b = a


// 基本数据类型  在赋值的时候值拷贝

// 复杂数据类型  栈内存中存地址,堆内存中存真实的值,赋值后两个变量指向同一块内存空间(或者说只复制了指向某个对象的指针)  修改被赋值的变量,原始变量也会跟着改变


// 深拷贝

// 1.Objecet.assign()

// 可以对非嵌套对象进行深拷贝的方法,如果对象中出现嵌套情况,那么其他被嵌套对象的行为就成了普通的浅拷贝。


// 2.JSON.stringify()/JSON.parse()

// 对于 undefined、任意的函数以及 symbol 三个特殊的值分别作为对象属性的值、数组元素、单独的值时 JSON.stringify()将返回不同的结果。

const data = {

    a: "aaa",

    b: undefined,

    c: Symbol("dd"),

    fn: function() {

        return true;

    }

   

};

   

JSON.stringify(data); // 输出: "{"a":"aaa"}"


// 假设 undefined、任意的函数以及 symbol 值作为数组元素会是怎样呢

JSON.stringify(["aaa", undefined, function aa() {


    return true

   

}, Symbol('dd')]) // 输出:"["aaa",null,null,null]"


// 单独序列化这些值会是什么样的结果呢

JSON.stringify(function a (){console.log('a')})

// undefined


JSON.stringify(undefined)

// undefined


JSON.stringify(Symbol('dd'))

// undefined


// 3.用递归的方式进行深拷贝   (对象深拷贝)

function deepClone(dest,src){      //dest为目标对象  src为源对象

    var dest=dest||{}

    for(var key in src){

        if(typeof src[key]==="object"){    //typeof[] 和 typeof{} 结果都是objct

            //如果对象的属性又是对象

            dest[key]=(src[key].constructor===Array)?[]:{}

            deepClone(dest[key],src[key])

        }else{

            dest[key]=src[key]

        }

    }

    return dest

}

var a={

    name:"Bob",

    age:16,

    parents:{

        father:"Jack",

        mother:"Marry"

    }

}

var b=deepClone({},a)

console.log(a)

console.log(b)

// 4.引入函数库 lodash,该函数库也有提供 _.cloneDeep()

var _ = require('lodash');

var obj1 = {

 a: 1,

 b: { f: { g: 1 } },

 c: [1, 2, 3]

};

var obj2 = _.cloneDeep(obj1);

console.log(obj1.b.f === obj2.b.f);


// 浅拷贝

// 1.Objecet.assign()

// 可以对非嵌套对象进行深拷贝的方法,如果对象中出现嵌套情况,那么其他被嵌套对象的行为就成了普通的浅拷贝。

// 2.Array.concat() //数组连接

// 3.Array.slice()  //数组切片



深拷贝和浅拷贝的评论 (共 条)

分享到微博请遵守国家法律