這幾乎是前端面試的高頻問題。
什么是深淺拷貝?
淺拷貝
var a = {name:'steven'}
var b = a
b.name = "bob"
console.log(a) // {name:'bob'}
console.log(b) // {name:'bob'}
把對象a的值賦值給b,再修改b.name的值, a.name的值跟著一起改變了,這就是淺拷貝。
非專業(yè)解釋: 因?yàn)閍 和 b的指針指向同一個內(nèi)存空間,賦值只是對指針進(jìn)行了拷貝,故為淺拷貝。
深拷貝
顯而易見,深拷貝就是要修改b.name時, a.name的值不變。 說白了就是新開辟一塊內(nèi)存空間存儲b。
第一種方法
目標(biāo)對象只有一層如 {name:'steven'}
var a = {name:'steven'}
var b = JSON.parse(JSON.stringify(a))
// 先將其JSON序列化,再解析,得到深拷貝的a
b.name = 'bob'
console.log(a) // {name:'steven'}
console.log(b) // {name:'bob'}
不太建議使用。
缺點(diǎn):深拷貝之后,不管這個對象原來的構(gòu)造函數(shù)是什么,在深拷貝之后都會變成Object。同時如果對象中存在循環(huán)引用的情況也無法正確處理。 引用:https://blog.csdn.net/yangyixue123/article/details/79687859
第二種方法
var a = {name:'steven'}
var b = Object.assign({},a)
// 使用ES6的Object.assign方法
b.name = 'bob'
console.log(a) // {name:'steven'}
console.log(b) // {name:'bob'}
第三種方法,寫一個遞歸方法
function deepCopy(obj) {
var result = Array.isArray(obj) ? [] : {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object') {
result[key] = deepCopy(obj[key]); //遞歸復(fù)制
} else {
result[key] = obj[key];
}
}
}
return result;
}