先來了解一下這些:在js中變量類型基本分為兩種:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型;
基本類型:Underfied Null Boolean Number String。(保存在棧內(nèi)存)
引用類型:可能包含多個值的對象。(保存在堆內(nèi)存中)
根本原因在于保存在棧內(nèi)存的必須是大小固定的數(shù)據(jù),引用類型的大小不固定镇饺,只能保存在堆內(nèi)存中,但是我們可以把它的地址寫在占內(nèi)存中以供我們訪問琢歇。
深淺拷貝:
淺拷貝:1)在復(fù)制基本數(shù)據(jù)類型時兰怠,我們直接使用=完成復(fù)制
2)在引用類型的時候梦鉴,我們循環(huán)遍歷對象,對每個屬性或值使用=完成復(fù)制
深拷貝:深復(fù)制實現(xiàn)的方式:對屬性中所有引用類型的值揭保,遍歷到是基本類型的值為止肥橙,從這種方式上,我們很容易就可以想到利用遞歸來實現(xiàn)深復(fù)制秸侣。
function deepCopy (obj) {
var result;
//引用類型分?jǐn)?shù)組和對象分別遞歸
if (Object.prototype.toString.call(obj) == '[object Array]') {
result = []
for (i = 0; i < obj.length; i++) {
result[i] = deepCopy(obj[i])
}
} else if (Object.prototype.toString.call(obj) == '[object Object]') {
result = {}
for (var attr in obj) {
result[attr] = deepCopy(obj[attr])
}
}
//值類型直接返回
else {
return obj
}
return result
}
對于深淺復(fù)制的區(qū)別存筏,其實核心的關(guān)鍵點就是是只復(fù)制了第一屬性還是完全復(fù)制了所有的屬性,使用slice和concat對對象數(shù)組的拷貝,整個拷貝還是淺拷貝味榛,拷貝之后數(shù)組各個值的指針還是指向相同的存儲地址椭坚。
因此,slice和concat這兩個方法搏色,僅適用于對不包含引用對象的一維數(shù)組的深拷貝
轉(zhuǎn)載于https://segmentfault.com/a/1190000008838101