区别
浅拷贝基本类型之前互不影响,引用类型其中一个对象改变了地址,就会影响另一个对象;
深拷贝改变新对象不会影响原对象,他们之前互不影响。
// 创建一个原始对象
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 } }