1. 浅拷贝
当拷贝的是一个基本数据类型时,拷贝的就是数值;而当拷贝的是一个复杂数据类型的时,
拷贝的就是地址,相当于两个复杂数据类型指向同一个地址,其中一个数据发生改变都会改变。
例如:
(1)基本数据类型
var num = 100
var num2 = num
num2 = 200
console.log(num)
console.log(num2)
总结:当拷贝后的数值发生改变时,原数据不会随着改变,两个数据各不相干,在栈内存中排列。
(2)复杂数据类型
(2.1) 对象赋值
let obj = {
name: "curry",
age: 20,
obj2: {
name: "kobe",
age: 200
}
}
let obj2 = obj
obj.name = "james"
obj.obj2.name = "joden"
console.log(obj.name)
console.log(obj2.name)
console.log(obj.obj2.name)
console.log(obj2.obj2.name)
(2.2) 浅拷贝方式之一 Object.assign()
let copyObj = Object.assign({}, obj)
obj.name = "sss"
obj.obj2.name = "ddd"
console.log(obj.name)
console.log(copyObj.name)
console.log(obj.obj2.name)
console.log(copyObj.obj2.name)
总结:使用Object.assign()来实现拷贝时,当obj对象只有一层的时候,是深拷贝,有两层
的时候,是浅拷贝。
2. 深拷贝,拷贝一个完全相同的对象,两个对象互不相干,修改其中一个,不会影响另外一个
2.1 实现方式之一 JSON.parse(JSON.stringify())
const obj = {
name: "skm",
age: 20,
obj2: {
name: "curry",
age: 22
}
}
const copyobj = JSON.parse(JSON.stringify(obj))
obj.name = "james"
obj.obj2.name = "kobe"
console.log(obj.name)
console.log(copyobj.name)
console.log(obj.obj2.name)
console.log(copyobj.obj2.name)
总结:该方法只能拷贝数组或对象,不能拷贝函数。因为JSON.stringify()不能接收函数
2.2 自定义深拷贝函数
function deepClone(oldObj){
if(oldObj == null){
return null
}
if(typeof oldObj !== "object"){
return oldObj
}
const newObj = Array.isArray(oldObj) ? [] : {}
for (const key in oldObj) {
console.log(key, oldObj[key]);
newObj[key] = deepClone(oldObj[key])
}
return newObj
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?