想要知道js
数据深浅拷贝的原理,那一定要知道它们存储的方式。步入正题之前我们先简单介绍一下数据类型及其存储方式。
number
/ string
/ boolean
/ undefined
/ null
object
/ function
/ array
在内存的内部空间划分了许多内存颗粒,内存颗粒分为栈、堆
深拷贝:复制复杂数据类型值的拷贝方式
浅拷贝:复制了复杂数据类型的地址的拷贝方式
let obj = {name:"admin"};
let objCopy = obj;
console.log(obj); // {name:"admin"}
console.log(objCopy); // {name:"admin"}
obj
存在栈中的指向堆中数据的地址赋给了objCopy
,也就是说现在栈中的obj
和objCopy
指向了存在堆中的同一个数据。// 接上面的代码
objCopy.name = "root";
console.log(objCopy); // {name:"root"}
console.log(obj); // {name:"root"}
let obj = {name:"admin"};
let objCopy = {}; // 相当于在内存中重新划分了空间来保存objCopy这个变量
objCopy.name = obj.name;
console.log(obj); // {name:"admin"}
console.log(objCopy); // {name:"admin"}
// 更改objCopy的值
objCopy.name = "root";
console.log(obj); // {name:"admin"}
console.log(objCopy); // {name:"root"}
objCopy
,此时obj
和objCopy
是存在栈中的没有关系的两个不同的地址obj
的值赋给objCopy
objCopy
的值是不会对obj
造成任何影响的,毕竟两者存在栈中的不同地址指向的是堆中不同的数据如果变量存在多个值,使用遍历来实现深拷贝
let obj = {
name: "admin",
age: 18,
gender: "女“
}
let objCopy = {};
for (let i in obj) {
objCopy[i] = obj[i];
}
console.log(objCopy); // {name: "admin", age: 18, gender: "女"}
objCopy.age = 25; // 更改objCopy的值不会影响obj的值
console.log(obj); // {name: "admin", age: 18, sex: "女"}
console.log(objCopy); // {name: "admin", age: 25, sex: "女"}
本文地址:https://blog.csdn.net/qq_41860731/article/details/107292494
如对本文有疑问, 点击进行留言回复!!
selenium + ajax抓取英雄联盟全部英雄的详细信息及多线程保存全部皮肤图片到本地
网友评论