為什麼在 JavaScript 中更改陣列會影響副本?
在 JavaScript 中,陣列是對象,變數保存這些對象的引用,而不是物體本身。在為陣列指派新值時,這種繼承可能會導致意外行為。
考慮以下範例:
// Declare an array and its copy var myArray = ['a', 'b', 'c']; var copyOfMyArray = myArray; // Modify the copy of the array copyOfMyArray.splice(0, 1); // Display the values alert(myArray); // ['b', 'c'] alert(copyOfMyArray); // ['b', 'c']
透過操作 copyOfMyArray,我們無意中修改了 myArray。這是因為像 myArray 和 copyOfMyArray 這樣的變數指向同一個底層陣列物件。
陣列與數字
相反,當使用像 myNumber 和 copyOfMyNumber 這樣的數字時,每個變數都會儲存值本身的副本。修改一個不會影響另一個。
var myNumber = 5; var copyOfMyNumber = myNumber; // Decrement the copy of the number copyOfMyNumber--; // Display the values alert(myNumber); // 5 alert(copyOfMyNumber); // 4
後果和解決方法
理解這種行為對於正確的物件操作至關重要。如果您確實需要數組的不同副本,請使用 slice 方法建立淺副本:
var copyOfMyArray = myArray.slice(0);
但是,值得注意的是,此淺副本僅複製數組對其元素的引用。任何內部物件仍將引用相同的原始實例。
以上是為什麼當原始陣列發生變化時,JavaScript 陣列副本也會變更?的詳細內容。更多資訊請關注PHP中文網其他相關文章!