JavaScript 深淺復制
JavaScript是一種非常流行的編程語言,在Web開發中使用廣泛。雖然它是一種靈活的編程語言,但這也使它極容易出現數據復制問題,特別是在對象和數組的復制中。JavaScript 中有 “淺復制” 和 “深復制” 的概念,讓我們看看它們之間的差異。
淺復制
簡單來說,淺復制只創建對象的一個副本,而不是對象內部的所有數據。在JavaScript中,我們通常使用“Object.assign()”函數來實現淺復制。例如:
let source = { name: 'Tom', age: 24, address: { city: 'LA', state: 'CA' } }; let shallowCopy = Object.assign({}, source); console.log(shallowCopy);在此示例中,我們使用Object.assign()函數將“source”對象淺復制到“shallowCopy”對象中。現在,“shallowCopy”對象與“source”對象具有相同的屬性和值。因此,我們可以使用以下代碼來判斷它們是否相等:
console.log(source === shallowCopy); // false console.log(source.name === shallowCopy.name); // true console.log(source.address === shallowCopy.address); // true我們發現,淺復制只復制了第一層對象及其屬性,但是“address”屬性引用的第二層對象只是引用了原始對象的引用,這就是它們仍然引用相同內存地址的原因。 深復制 深復制是遞歸地將一個對象及其子對象完全復制的過程。當我們修改副本對象時,不會影響到原始對象。為了實現深復制,我們可以遞歸地復制每個對象屬性并將其分配給新對象。
function deepCopy(object) { let result = {}; for(let key in object) { if(typeof object[key] === 'object') { result[key] = deepCopy(object[key]); // 使用遞歸 } else { result[key] = object[key]; } } return result; } let source = { name: 'Tom', age: 24, address: { city: 'LA', state: 'CA' } }; let deepCopy = deepCopy(source); console.log(deepCopy);在這個例子中,我們創建了一個遞歸函數,該函數遍歷每個屬性并為每個屬性創建新的對象引用。由于我們使用遞歸,因此我們可以深入了解更深層次的對象屬性。deepCopy()函數將“source”對象深復制到“deepCopy”對象中。現在,“deepCopy”和“source”兩個對象在內存中是獨立的,我們可以改變一個對象而不影響另一個對象。
source.name = 'Jerry'; source.address.city = 'San Fransisco'; console.log(source); console.log(deepCopy);在上面的示例中,我們更改了“source”和“source.address”對象的屬性,在淺復制中,“shallowCopy”對象的“address”屬性也會更改,但在深復制中,“deepCopy”對象的“address”屬性不會更改,因為這是一個完全獨立的對象。 總結 淺復制和深復制是JavaScript中讓我們決定復制策略的兩個選項。淺復制只復制對象的屬性,而不復制它們內部引用的其他子對象,而深復制會完全遞歸復制對象及其所有子對象。如果我們需要“只是”復制一個對象的幾個屬性,那么淺復制就足夠了,但是如果我們需要完全復制一個對象及其所有子對象,則應使用深復制。