1.賦值
賦值是將原對象的內(nèi)存地址直接給到新對象
var myInfo = {
tel: '123456',
job: {
title: '初級前端工程師',
year: 1
}
}
var newObject1 = myInfo
myInfo.tel = '000'
myInfo.job.title = '中級前端工程師'
console.log(newObject); // { tel: '000', job: { title: '中級前端工程師', year: 1 } }
2.淺拷貝
生成一個新的對象,新對象擁有原對象的所有屬性稼稿。如果屬性值的類型是基本類型薄榛,就將原屬性的值拷貝過來;如果屬性值是引用類型让歼,就將原屬性值的地址拷貝過來敞恋,如果原屬性值發(fā)生改變時,新屬性的值也會發(fā)生改變谋右。
var myInfo = {
tel: '123456',
job: {
title: '初級前端工程師',
year: 1
}
}
var newObject1 = Object.assign({}, myInfo)
myInfo.tel = '000'
myInfo.job.title = '中級前端工程師'
console.log(newObject); // { tel: '123456', job: { title: '中級前端工程師', year: 1 } }
3.深拷貝
將原對象中的各個屬性值重新分配內(nèi)存地址耳舅,不論原對象的屬性值是基本類型還是引用類型,原對象屬性值的變化都不會影響新對象的屬性值倚评。
let myInfo = {
tel: '123456',
job: {
title: '初級前端工程師',
year: 1
}
}
let newInfo = JSON.parse(JSON.stringify(myInfo))
console.log(newInfo) // { tel: '123456', job: { title: '初級前端工程師', year: 1 } }
myInfo.job.title = '中級前端工程師'
myInfo.tel = '111'
console.log(newInfo) // { tel: '123456', job: { title: '初級前端工程師', year: 1 } }
這種方法雖然可以實現(xiàn)數(shù)組或?qū)ο笊羁截?但不能處理函數(shù)和正則,因為這兩者基于JSON.stringify和JSON.parse處理后馏予,得到的正則就不再是正則(變?yōu)榭諏ο螅┨煳啵玫降暮瘮?shù)就不再是函數(shù)(變?yōu)閚ull)了
/*深拷貝函數(shù)*/
let myInfo = {
name: 'hana',
fn: function() {
console.log(this.name)
}
}
function deepClone(obj) {
let result = typeof obj.splice === "function" ? [] : {};
if (obj && typeof obj === 'object') {
for (let key in obj) {
if (obj[key] && typeof obj[key] === 'object') {
result[key] = deepClone(obj[key]) //如果對象的屬性值為object的時候,遞歸調(diào)用deepClone,即在吧某個值對象復(fù)制一份到新的對象的對應(yīng)值中
} else if (obj[key] && typeof obj[key] === 'function') {
result[key] = (function foo(){return obj[key]})() // 如果對象的屬性值為函數(shù)霞丧,立即執(zhí)行返回該函數(shù)
}
else {
result[key] = obj[key] //如果對象的屬性值不為object的時候呢岗,直接復(fù)制參數(shù)對象的每一個鍵值到新的對象對應(yīng)的鍵值對中。
}
}
return result
}
return obj
}
let newInfo = deepClone(myInfo)
console.log(newInfo) // { tel: '123456', job: { title: '初級前端工程師', year: 1 } }