2 回答

TA貢獻1820條經驗 獲得超3個贊
這是關于分配在腳本中的工作方式。給定以下代碼:
const a = { foo: "bar" };
const b = a;
變量和兩者都指向同一對象。這意味著內存中只有一個對象,當您嘗試使用對象訪問對象時,將反映對象指向的可變,反之亦然。例如:abab
const a = { foo: "bar" };
const b = a;
a.foo = "baz";
console.log(a);
console.log(b);
展開代碼段
那么現在,我們如何使這種情況不會發生呢?為此,我們可以將 的淺副本分配給 。這可以通過幾種不同的方式完成,下面使用傳播運算符(...):ab
const a = { foo: "bar" };
const b = { ...a };
a.foo = "baz";
console.log(a);
console.log(b);
展開代碼段
所以現在,內存中有兩個不同的對象。你會注意到我稱之為淺層復制,這很重要:如果你有深層對象,你需要深度復制才能完成同樣的解耦。
如何在您的特定情況下解決此問題:
針對您的特定情況的 TLDR 是,您的臨時變量應該是數組的淺副本,而不是對現有數組的引用:
let temp = [...seq];

TA貢獻1827條經驗 獲得超4個贊
我在下面解釋原因:
對于字符串和數字,javascript 似乎是按值傳遞的,而數組等對象是按引用傳遞的。
這意味著在你的第一個例子中;該函數正在獲取對原始數組的引用,當您這樣做時,temp實際上只是一個指向傳入的原始對象的指針。在這種情況下,當您修改溫度時,情況就是這樣;它實際上是在修改字母表。let temp = seq
alphabet
按值傳遞只是將值發送到函數,因此原始變量與數字示例中的變量相同。
為了獲得預期的結果,您需要制作數組的深度副本,例如 .let temp = deepCopy(seq)
我認為使用可能只是用戶知道不要修改它的語法,一些編輯器不會讓你在代碼中重新修改const,但在這種情況下,它以迂回的方式發生。const
添加回答
舉報