$.extend()的深拷貝和淺拷貝詳細講解

語法:jQuery.extend( [deep ], target, object1 [, objectN ] )app

描述: 將兩個或更多對象的內容合併到第一個對象。函數

關於$.extend()的用法網上有不少文章,在這裏指向寫寫對深淺拷貝的理解spa

深淺拷貝對應的參數就是[deep],是可選的,爲true或false。默認狀況是false(淺拷貝),而且false是不可以顯示的寫出來的。若是想寫,只能寫true(深拷貝)~~code

什麼是深、淺拷貝呢?先講定義,再舉例子對象

在默認狀況下,經過$.extend()合併操做不是遞歸的(淺拷貝);若是第一個對象的屬性自己是一個對象或數組,那麼它將徹底用第二個對象相同的key重寫一個屬性。這些值不會被合併。然而,若是將 true 做爲該函數的第一個參數,那麼會在對象上進行遞歸的合併(深拷貝)。blog

淺拷貝(false 默認):若是第二個參數對象有的屬性第一個參數對象也有,那麼不會進行相同參數內部的比較,直接將第一個對象的相同參數覆蓋。繼承

深拷貝(true):若是第二個參數對象有的屬性第一個參數對象也有,還要繼續在這個相同的參數向下一層找,比較相同參數的對象中是否還有不同的屬性,若是有,將其繼承到第一個對象,若是沒有,則覆蓋。遞歸

栗子:get

var object1 = { apple: 0, banana: { weight: 52, price: 100 }, cherry: 97 }; var object2 = { banana: { price: 200 }, durian: 100 }; //默認狀況淺拷貝 //object1--->{"apple":0,"banana":{"price":200},"cherry":97,"durian":100} //object2的banner覆蓋了object1的banner,可是weight屬性未被繼承 //$.extend(object1, object2);

//深拷貝 //object1--->{"apple":0,"banana":{"weight":52,"price":200},"cherry":97,"durian":100} //object2的banner覆蓋了object1的banner,可是weight屬性也被繼承了呦
$.extend(true,object1, object2); console.log('object1--->'+JSON.stringify(object1));

仔細閱讀上面這段代碼,去運行看結果,你就會理解什麼是深拷貝和淺拷貝了!

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息