亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在JavaScript中對數組“B”的更改會傳播到數組“A”?

為什么在JavaScript中對數組“B”的更改會傳播到數組“A”?

慕容森 2022-09-16 20:59:32
我創建了一個名為“alphabet”的常量,并將其分配給包含字母表前 5 個字母的數組。然后,我想要一個函數,該函數將向數組中的每個字符添加一個數字,以枚舉它們。但是,我不希望修改原始“字母表”數組中的值,因此我在枚舉函數中創建了一個“temp”變量,并且只對其進行了更改。但是,我對“temp”所做的任何更改都擴展到“字母表”。我不明白為什么,我想阻止這種情況發生。const alphabet = ["a", "b", "c", "d", "e"];function alphaPosition(seq) {  //'temp' gets 'seq' to avoid making changes directly on the provided argument.  let temp = seq;  //adds indexes to each element in the 'temp' array:  for (let i = 1; i <= temp.length; i++) {    temp[i - 1] = temp[i - 1] + i;  }  return temp;}console.log(  "Step 1. 'alphabet' array before running the 'alphaPosition' function:");console.log(alphabet);console.log(  "Step 2. This is the final value of 'temp' in 'alphaPosition' after running the function. An index has been added to every element in the array, as expected:");console.log(alphaPosition(alphabet));console.log(  "Step 3. Here's the 'alphabet' array after running 'alphaPosition'. Indexes have also been added to every element, despite not modifying the function argument directly:");console.log(alphabet);輸出:/*-> Step 1. 'alphabet' array before running the 'alphaPosition' function:-> ["a", "b", "c", "d", "e"]-> Step 2. This is the final value of 'temp' in 'alphaPosition' after running the function. An index has been added to every element in the array, as expected:-> ["a1", "b2", "c3", "d4", "e5"]-> Step 3. Here's the 'alphabet' array after running 'alphaPosition'. Indexes have also been added to every element, despite not modifying the function argument directly:-> ["a1", "b2", "c3", "d4", "e5"]*/為什么對“臨時”的更改會傳播為“字母表”?我希望,既然我把“字母表”定義為一個常量,那么甚至不應該修改它。此外,我從不在函數中對其進行更改。我只用它來定義“溫度”。有沒有辦法防止這些傳播的發生?為什么使用中間變量來避免對原始數字進行更改,而不是數組?如果對此有任何幫助或澄清,我將不勝感激。我已經將我的代碼添加到這個CodePen中,以防你想調整它或嘗試更多。提前感謝您的任何幫助。
查看完整描述

2 回答

?
DIEA

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];


查看完整回答
反對 回復 2022-09-16
?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

這似乎是重復的。潛在的答案就在這里。

我在下面解釋原因:

對于字符串和數字,javascript 似乎是按值傳遞的,而數組等對象是按引用傳遞的。

這意味著在你的第一個例子中;該函數正在獲取對原始數組的引用,當您這樣做時,temp實際上只是一個指向傳入的原始對象的指針。在這種情況下,當您修改溫度時,情況就是這樣;它實際上是在修改字母表。let temp = seqalphabet

按值傳遞只是將值發送到函數,因此原始變量與數字示例中的變量相同。

為了獲得預期的結果,您需要制作數組的深度副本,例如 .let temp = deepCopy(seq)

我認為使用可能只是用戶知道不要修改它的語法,一些編輯器不會讓你在代碼中重新修改const,但在這種情況下,它以迂回的方式發生。const


查看完整回答
反對 回復 2022-09-16
  • 2 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號