JS關(guān)于基礎(chǔ)類(lèi)型和引用類(lèi)型的數(shù)據(jù)請(qǐng)點(diǎn)擊:JS數(shù)據(jù)類(lèi)型
請(qǐng)充分理解之后再來(lái)看這篇文章哦~
基本類(lèi)型的拷貝
先來(lái)看一段非常經(jīng)典的代碼
var a = 1;
var b = a;
a = 200;
console.log(a); //200
console.log(b); //1
我們應(yīng)該知道基本類(lèi)型“按值傳遞”蹋半,引用類(lèi)型“按引用傳遞”募书,數(shù)值作為基本類(lèi)型是保存在棧內(nèi)存中晕窑,可以直接拿來(lái)用的,賦值是什么那么之后就一直是什么,不會(huì)受到傳遞元素的改變帶來(lái)的影響,所以這里就不難理解上面的代碼得到的值的原因了。
引用類(lèi)型的拷貝
簡(jiǎn)單說(shuō)他爸,引用類(lèi)型是生成一個(gè)指針保存的堆內(nèi)存中,當(dāng)給引用類(lèi)型賦值時(shí)果善,我們寫(xiě)的內(nèi)容是在棧內(nèi)存中诊笤,也就是說(shuō)我們拿到的其實(shí)是一個(gè)指針(不會(huì)直接拿到棧內(nèi)存中的內(nèi)容)。這個(gè)指針是指向棧內(nèi)存中這個(gè)引用類(lèi)型的代碼巾陕。
提到拷貝涉及到的兩種拷貝類(lèi)型:深拷貝和淺拷貝
淺拷貝
淺拷貝針對(duì)對(duì)象中的基本類(lèi)型的值生效讨跟,但是對(duì)引用類(lèi)型中還有引用類(lèi)型的情況就會(huì)失效。
var a = {
name:"mary",
age:20,
hobby:"eat"
}
function shadowCopy(obj){
var newObj = {};
for(var key in obj){
newObj[key] = obj[key];
}
return newObj;
}
var b = shadowCopy(a);
console.log(b)
這是得到的就是一個(gè)和a完全一樣的對(duì)象惜论,這個(gè)函數(shù)就是一個(gè)淺拷貝函數(shù)许赃。
深拷貝
深拷貝是針對(duì)對(duì)象中還有引用類(lèi)型的情況,使用深拷貝可以使新創(chuàng)建的對(duì)象和原來(lái)的完全脫離關(guān)系
var a = {
name:"mary",
age:20,
friend:{
name:"哈哈",
age:19,
hobby:"eat"
}
}
function deep(obj){
var newobj = {};
for(var key in obj){
if(obj.hasOwnProperty(key)){
if(typeof obj[key] === "number" || typeof obj[key] === "string" || typeof obj[key] === "boolean" || obj[key] === undefined || obj[key] === null){
newobj[key] = obj[key];
}else{
newobj[key] = deep(obj[key]);
}
}
}
return newobj;
}
var b = deep(a);
a.friend.age = 29; //此處修改了a對(duì)象中的某個(gè)值馆类,但是經(jīng)過(guò)函數(shù)處理混聊,b里面的這個(gè)值不會(huì)發(fā)生改變
console.log(a);
console.log(b);
里面的hasOwnProperty這個(gè)屬性請(qǐng)參考 MDN的解釋