說到深淺拷貝的時候就不得不說一下js中的變數型別了:
淺拷貝分兩種情況, 拷貝源物件的引用和源物件拷貝例項, 但其屬性拷貝引用.
拷貝源的引用
eg:
let obj1 = ;
let obj2 = obj1;
console.log(obj1 === obj2); // true
obj1.a = 2;
console.log(obj2.a); // 2
源物件拷貝例項, 其屬性物件拷貝引用
外層源物件是拷貝例項, 但是如果源物件的屬性元素為複雜資料型別時, 內層元素拷貝引用. 對源物件操作時不影響拷貝物件. 但對其屬性操作時, 會改變拷貝物件屬性的值. 常用方法:array.prototype.slice()
,array.prototype.concat()
,jquery
的$.extend({}, obj)
,object.assign()
等. eg:
let obj1 =
};let obj2 = object.assign({}, obj1);
obj2.a = 2;
obj2.b[0] = 2;
obj2.c.c1 = 10
console.log(obj1);
/**輸出結果:
}**/
這上面的例子中obj1
為源物件,obj2
為拷貝物件. 拷貝後修改拷貝物件的屬性a
沒有影響到源物件, 修改拷貝物件的複雜資料型別屬性b
,c
後影響到源物件.
深拷貝過後, 源物件、拷貝物件包括其內部元素(包括複雜型別元素)都不互相干擾. 常見方法有json.parse(json.stringify(obj))
,jquery
的$.extend(true, {}, obj)
,lodash
的_.clonedeep
和_clone(value, true)
. eg:
let obj1 =
};let obj2 = json.parse(json.stringify(obj1));
obj2.a = 2;
obj2.b[0] = 2;
obj2.c.c1 = 10
console.log(obj1);
/**輸出結果:
}**/
最後輸出源物件(obj1
) 得到結果是源物件未變化.
深拷貝就是增加乙個指標(棧記憶體)申請乙個新的堆記憶體, 並讓這個指標指向這個堆記憶體. 當我們需要複製源物件而又不能修改源物件的時候, 深拷貝就是你想要的.
那麼是時候自己實現乙個深拷貝方法了:
function deepclone(sobj, cobj) );
for(let i in sobj) ;
deepclone(sobj[i], cobj[i])
} else
};return cobj;
}
js中的深拷貝與淺拷貝
今天面試被問到js中深淺拷貝的問題,當時回答的並不好,回來搜尋了一波,現做下總結 js中針對引用型別的拷貝分為兩種 深拷貝和淺拷貝 淺拷貝比較簡單,分為兩類,一類是直接對源物件進行拷貝,實際上就是引用型別的賦值,拷貝的僅僅是物件引用,如 var obj var newobj obj newobj.a...
JS中的深拷貝與淺拷貝
深拷貝和淺拷貝最根本的區別在於是否是真正獲取了乙個物件的複製實體,而不是引用,深拷貝的實現 1.通過遞迴解決 var a function deepcopy initobj,finalobj for var i in initobj if typeof initobj i object argume...
JS中的深拷貝與淺拷貝
淺拷貝是物件的逐位複製。建立乙個新物件,該物件具有原始物件中值的精確副本。如果物件的任何欄位是對其他物件的引用,則只複製引用位址,即,複製記憶體位址。大白話講就是,淺拷貝是對物件位址的複製,並沒有開闢新的棧,也就是複製的結果是兩個物件指向同乙個位址,修改其中乙個物件的屬性,則另乙個物件的屬性也會改變...