一、什么是拷贝
拷贝就是复制,复制不同数据类型的代码。
二、两种数据类型及存放
1、栈
栈内存,存放简单数据类型和引用类型指针。
2、堆
堆内存,存放应用数据类型。
3、简单数据类型
简单数据类型分为:字符串、、数字型、null、undefind、布尔值。
简单数据类型存放在栈里
拷贝
简单数据类形就是将: 变量1赋值给变量2,从而实现拷贝。
let num1 = "哈哈"
let num2 = num1
console.log(num1,num2)//哈哈 哈哈
4、复杂数据类型
复杂数据类型分为:数组、对象。
三、浅拷贝
指创建一个新的对象或数组,并将原始对象或数组的值复制到新对象或数组中的过程。浅拷贝只复制对象或数组的引用,而不是复制其内部的子对象或子数组。
三种方法
1、扩展运算符(...):
扩展运算符可以创建一个新的数组或对象,并将原始数组或对象的所有属性复制到新的数组或对象中。
let obj = {
a: {name: 'abc'},
b: 2
}
let newObj = {}
newObj.a=obj.a
newObj.b=obj.b
2、Object.assign():
Object.assign() 方法可以将一个或多个源对象的属性复制到目标对象中,并返回目标对象。这也可以用于浅拷贝对象。
const originalObject = { name: 'John', age: 30 };
const newObject = Object.assign({}, originalObject);
3、Array.slice():
对于数组,可以使用 slice() 方法创建一个新的数组,并将原始数组的元素复制到新数组中。
const originalArray = [1, 2, 3];
const newArray = originalArray.slice();
注意:
浅拷贝只能复制一层对象或者数组。若包含一个数组或者对象则不能拷贝到。要用到深拷贝。
四、深拷贝
创建一个全新的对象或数组,并完全复制原始对象或数组的所有值和嵌套的子对象或子数组。深拷贝不仅复制了对象或数组本身,还会递归地复制其所有嵌套的子对象或子数组,确保新创建的对象或数组与原始对象或数组完全独立,没有任何引用关系。
两种方法:
1、递归
递归地遍历原始对象或数组的属性或元素,并创建相应的新对象或数组。对于每个嵌套的子对象或子数组,再次调用深拷贝函数进行递归复制。这样可以确保所有的嵌套层级都被复制。
function deepCopy(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj; // 非对象或 null 直接返回
}
let newObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepCopy(obj[key]);
}
}
return newObj;
}
// 示例
const originalObject = { name: 'John', age: 30, hobbies: ['reading', 'music'] };
const newObject = deepCopy(originalObject);
2、第三方库
Lodash库,cloneDeep()方法
复制一个对象或数组,并创建一个全新的对象或数组,确保复制后的对象或数组与原始对象或数组完全独立
const _ = require('lodash');
// 示例
const originalObject = { name: 'John', age: 30, hobbies: ['reading', 'music'] };
const newObject = _.cloneDeep(originalObject);