什么是淺拷貝,深拷貝以及和他們之間的區(qū)別:
淺拷貝:是創(chuàng)建一個(gè)新對(duì)象,這個(gè)對(duì)象有著原始對(duì)象屬性值的一份精確拷貝。如果屬性是基本類型,拷貝的就是基本類型的值,如果屬性是引用類型,拷貝的就是內(nèi)存地址 。
深拷貝:是將一個(gè)對(duì)象從內(nèi)存中完整的拷貝一份出來,從堆內(nèi)存中開辟一個(gè)新的區(qū)域存放新對(duì)象。
區(qū)別:淺拷貝基本類型之前互不影響,引用類型其中一個(gè)對(duì)象改變了地址,就會(huì)影響另一個(gè)對(duì)象;深拷貝
改變新對(duì)象不會(huì)影響原對(duì)象,他們之前互不影響。
一、對(duì)象拷貝有什么意義:
在開發(fā)項(xiàng)目的過程中,我們?nèi)绾蔚玫絻蓚€(gè)相同的對(duì)象:
例如:stu_1 = {name: "xiaoming"};stu_2 = {name: "xiaoming"};
通過賦值僅僅是賦值了一個(gè)引用,而這兩個(gè)變量仍然指向同一個(gè)對(duì)象;
使用對(duì)象克隆技術(shù),才能得到真正的,兩個(gè)相同的對(duì)象
二、對(duì)象克隆的使用場(chǎng)景
1、將對(duì)象作為函數(shù)參數(shù)的時(shí)候,不希望操作原對(duì)象。
2、面試常見問題。
三、拷貝的算法
1、淺拷貝(被拷貝對(duì)象的屬性值全是原始類型)
let stu = {
name: "xiaoming",
age: 10
};
function copyObject(obj){ //傳進(jìn)來一個(gè)對(duì)象得到一個(gè)對(duì)象副本
let newObj = {}
// 拷貝的算法
for(let i in obj){
newObj[i] = obj[i]
}
// 返回新對(duì)象
return newObj
}
let newStu = copyObject(stu)
stu.age = 20
console.log(stu)
console.log(newStu)
2、深拷貝
let stu = {
name: "xiaoming",
age: 10,
bestFriend:{
name:"xiaohong",
age:10
}
};
// 深拷貝
function copyObject(obj) {
let newObj = {}
// 拷貝的算法
for (let i in obj) {
if(obj[i] instanceof Object){
newObj[i] = copyObject(obj[i]) //函數(shù)遞歸
}else{
newObj[i] = obj[i]
}
}
// 返回新對(duì)象
return newObj
}
let newStu = copyObject(stu)
stu.age = 20
console.log(stu)
console.log(newStu)
3、實(shí)現(xiàn)深拷貝的方法
1、遞歸
2、轉(zhuǎn)JSON(通過字符串轉(zhuǎn)義,將引用類型轉(zhuǎn)為原始類型,再復(fù)制原始類型的值)
let stu = {
name: "xiaoming",
age: 10,
bestFriend: {
name: "xiaohong",
age: 10
}
};
let stuStr = JSON.stringify(stu)
let newStu = JSON.parse(stuStr)
stu.age = 20
console.log(stu)
console.log(newStu)
2、