今天的code rewiew , 看到了如下的代碼來實現深拷貝的效果。
var a = {name:'demo'};
var c = JSON.parse(JSON.stringify(a))
其實這樣的實現,看似是解決了問題:防止數據的意外篡改。但是,其實有很多的隱患。
性能
首先是前端性能問題,這樣做,對瀏覽器的性能消耗其實是很大的。尤其是在頁面頻繁render的時候,方法被重複調用,嚴重的話可能會導致瀏覽器的卡頓。
缺陷
通過序列化和反序列化的方式,來實現數據的深拷貝,對於普通的對象或者數組來說,本身沒有什麼問題,但是對於一些特殊的類型,其實是有缺陷的,比如NaN,比如Inifinity:
var a = {name:NaN,code:Infinity};
var c = JSON.parse(JSON.stringify(a))//{name: null, code: null}
而且如果出現循環引用的問題,同樣是不可靠的。
總結
僅僅綜合這幾點的話,我們在日常的開發中,就應該規避這種情況。解決的方法就是拋棄需要 deep clone 的代碼。
而且對於數據的修改,你本身應該就是能夠預期的,在這種情況下,我們也可以針對某些數據,替換覆蓋,而不是粗暴的去深拷貝。