深拷貝和淺拷貝在開發(fā)中我們會(huì)經(jīng)常使用,特別是在面試過程中會(huì)被經(jīng)常提起派诬,簡單來說
淺拷貝:就是對引用的拷貝(還是指向同一內(nèi)存地址)
深拷貝:就是對整個(gè)內(nèi)容的拷貝(完全不同的內(nèi)存地址)
比如我們有一下對象,當(dāng)我們把obj 賦值給obj1 時(shí),如果我們增加 obj1 likes 內(nèi)的元素個(gè)數(shù)尿背,那么obj 中l(wèi)ikes 也會(huì)相應(yīng)進(jìn)行修改,這有時(shí)不是我們想要的結(jié)果捶惜,此時(shí)就需要深拷貝來實(shí)現(xiàn)該功能
var obj = {
name: "lixiansheng",
age: 27,
likes: ["足球", "電視", "游戲"]
}
var obj1 = {
}
深拷貝實(shí)現(xiàn)田藐,此時(shí)我們修改obj1 時(shí)就不會(huì)影響到obj 了
- 1.創(chuàng)建對象,進(jìn)行原屬性的遍歷
- 2.使用hasOwnProperty篩選掉原型鏈上的屬性
- 3.使用typeof判斷是否是object(考慮到null的情況出現(xiàn))吱七,如果不是這直接賦值
- 4.如果是object 則判斷是數(shù)組還是對象
- 5.進(jìn)行遞歸
//深拷貝
function deepClone(origin, target) {
var target = target || {},
toStr = Object.prototype.toString,
arrayStr = "[object Array]"
for (var prop in origin) {
if (origin.hasOwnProperty(prop)) {
if (origin[prop] !== "null" && typeof(origin[prop]) == "object") {
if (toStr.call(origin[prop]) == arrayStr) {
target[prop] = []
} else {
target[prop] = {}
}
deepClone(origin[prop], target[prop])
} else {
target[prop] = origin[prop]
}
}
}
}