深拷贝和浅拷贝的区别

区别

浅拷贝基本类型之前互不影响,引用类型其中一个对象改变了地址,就会影响另一个对象;
深拷贝改变新对象不会影响原对象,他们之前互不影响。

		// 创建一个原始对象
        const originalObject1 = { a: 1, b: { c: 2 } };
        const originalObject2 = { a: 1, b: { c: 2 } };

        // 1、使用 Object.assign 进行浅拷贝 会影响原始子对象
        const shallowCopy = Object.assign({}, originalObject1);

        // 1、使用 JSON.stringify() 和 JSON.parse() 实现深拷贝
        const deepCopy = JSON.parse(JSON.stringify(originalObject2));

        // 修改深拷贝后的对象,不会影响原始对象
        shallowCopy.b.c = 3;
        deepCopy.b.c = 4;

        console.log(originalObject1); // 输出: { a: 1, b: { c: 3 } }
        console.log(shallowCopy);    // 输出: { a: 1, b: { c: 3 } }

        console.log(originalObject2); // 输出: { a: 1, b: { c: 2 } }
        console.log(deepCopy);    // 输出: { a: 1, b: { c: 4 } }

浅拷贝

如果属性是基本类型,拷贝的就是基本类型的值。如果属性是引用类型,拷贝的就是内存地址。即浅拷贝是拷贝一层,深层次的引用类型则共享内存地址
方法有:
Object.assign
Array.prototype.slice()
Array.prototype.concat()

// 创建一个原始对象
const originalObject = { a: 1, b: 2 };

// 使用 Object.assign 进行浅拷贝
const shallowCopy = Object.assign({}, originalObject);

// 修改浅拷贝后的对象,不会影响原始对象
shallowCopy.a = 3;

console.log(originalObject); // 输出: { a: 1, b: 2 }
console.log(shallowCopy);    // 输出: { a: 3, b: 2 }

使用拓展运算符实现的复制 const shallowCopy = { …originalObject };

// 创建一个原始数组
const originalArray = [1, 2, 3, 4, 5];

// 使用 slice 进行浅拷贝
const shallowCopy = originalArray.slice();
// 使用 concat 进行浅拷贝
const shallowCopy = originalArray.concat();

// 修改浅拷贝后的数组,不会影响原始数组
shallowCopy[0] = 6;

console.log(originalArray); // 输出: [1, 2, 3, 4, 5]
console.log(shallowCopy);    // 输出: [6, 2, 3, 4, 5]

深拷贝

深拷贝开辟一个新的栈,两个对象属完成相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性
方法有:
_.cloneDeep()
jQuery.extend()
JSON.stringify()

// 引入 lodash 库
const _ = require('lodash');

// 创建一个原始对象
const originalObject = { a: 1, b: { c: 2 } };

// 使用 _.cloneDeep() 进行深拷贝
const deepCopy = _.cloneDeep(originalObject);

// 修改深拷贝后的对象,不会影响原始对象
deepCopy.b.c = 3;

console.log(originalObject); // 输出: { a: 1, b: { c: 2 } }
console.log(deepCopy);    // 输出: { a: 1, b: { c: 3 } }
// 引入 jQuery 库
const $ = require('jquery');

// 创建一个原始对象
const originalObject = { a: 1, b: { c: 2 } };

// 使用 jQuery.extend() 进行深拷贝
const deepCopy = $.extend(true, {}, originalObject);

// 修改深拷贝后的对象,不会影响原始对象
deepCopy.b.c = 3;

console.log(originalObject); // 输出: { a: 1, b: { c: 2 } }
console.log(deepCopy);    // 输出: { a: 1, b: { c: 3 } }
// 创建一个原始对象
const originalObject = { a: 1, b: { c: 2 } };

// 使用 JSON.stringify() 和 JSON.parse() 实现深拷贝
const deepCopy = JSON.parse(JSON.stringify(originalObject));

// 修改深拷贝后的对象,不会影响原始对象
deepCopy.b.c = 3;

console.log(originalObject); // 输出: { a: 1, b: { c: 2 } }
console.log(deepCopy);    // 输出: { a: 1, b: { c: 3 } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值