1. 程式人生 > >對象的深度拓展$.extend(true,{},a,b),深入理解,小心陷阱

對象的深度拓展$.extend(true,{},a,b),深入理解,小心陷阱

com ges 深入理解 沒有 裏的 事物 cnblogs wid 希望

轉載:https://www.cnblogs.com/DJeanWeb/p/4388689.html

$.extend
一般情景下,使用深度拓展兩個對象時,我們想要的效果是,b對象覆蓋掉a對象中存在的所有屬性,沒有則新增到a對象中;
下面我們看一下我所遇到的問題:
技術分享圖片
我希望通過深度拓展將tmp中的editoption覆蓋掉ret中的editoption;所以采用了深度拓展方法 ret = $.extend(true,{},ret,tmp);
但結果並沒有達到我想要的效果:
技術分享圖片
對象屬性中的數組長度依然沒有發生變化。
通過樣例比較發現,數組長度雖然沒有發生變化,但是數組前排列在前8位的值發生了改變,也就是是說,變量深度拓展覆蓋到了數組的值,而不是覆蓋掉整個數組對象。

技術分享圖片
註意如果直接使用$.extend(a,b)將改變a對象值。註意對象引用引發的神奇bug

技術分享圖片

因為$.extend(a,b)返回的是將a通過與b融合以後的結果,a對象會被改變。

最後我直接使用$.extend({},a,b)解決此需求:即不改變a,b對象的引用,也返回了我想要的值。

總結:即使簡單的方法,也需深入理解,避免潛意識裏的認知幹擾對事物的判斷。

對象的深度拓展$.extend(true,{},a,b),深入理解,小心陷阱