以下是详解JS数据类型的值拷贝函数(深拷贝)的攻略:
什么是深拷贝
在 JS 中,我们把变量分为两类:基础类型和引用类型。基本类型的值直接存储在栈(stack)中,而引用类型的值存储在堆(heap)中,变量实际上是一个指针指向对应的地址。因此,基础类型变量的修改不影响其他变量,而引用类型变量的修改会影响所有指向同一地址的变量。而深拷贝就是将原始数据类型和引用数据类型中所有层级的数据都复制一份,形成一个新的数据,两者互不影响。
实现深拷贝的方法
1.递归实现深拷贝
function deepCopy(obj) {
// 如果不是复杂类型,直接返回值
if (typeof obj !== 'object') {
return obj;
}
// 如果是数组类型,创建一个新数组
if (Array.isArray(obj)) {
const result = [];
for (let i = 0; i < obj.length; i++) {
result.push(deepCopy(obj[i]));
}
return result;
}
// 如果是对象类型,创建一个新对象
const result = {};
for (let key in obj) {
result[key] = deepCopy(obj[key]);
}
return result;
}
2.JSON.parse和JSON.stringify实现深拷贝
这种实现方法的前提是原始数据必须是 JSON 可以表示的数据类型(如:对象、数组)。因为JSON.stringify只能序列化JSON可表示的数据类型。所以不能定义一些不支持的数据类型(如:函数)。
function deepCopy(obj) {
return JSON.parse(JSON.stringify(obj));
}
深拷贝的应用
1.利用递归实现深拷贝
// 需要复制的数组
const arr = [{
name: 'Tom',
age: 20
}, {
name: 'Jack',
age: 21
}];
// 复制数组
const copyArr = deepCopy(arr);
// 修改原数组的第一个元素名称
arr[0].name = 'Mary';
// 存在复制 结果 copyArr[0].name 仍旧是 'Tom'
console.log(copyArr[0].name);
2.利用JSON.parse和JSON.stringify实现深拷贝
// 需要复制的对象
const obj = {
name: 'Tom',
age: 20
};
// 复制对象
const copyObj = deepCopy(obj);
// 修改原对象名称
obj.name = 'Mary';
// 存在复制 结果 copyObj.name 仍旧是 'Tom'
console.log(copyObj.name);
以上就是详解JS数据类型的值拷贝函数(深拷贝)的完整攻略,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JS数据类型的值拷贝函数(深拷贝) - Python技术站