簡體   English   中英

為傳遞給函數的數組賦值

[英]Assign value to the array passed to a function

var arrN = [1, 2, 3];

function init(arr){
   arr = [];
   console.log(arrN) //output [1, 2, 3], expect []  
}

init(arrN);

使用splicepush方法時,正在修改傳遞給函數的數組。 所以我試圖理解使用賦值運算符時發生了什么,為什么它不改變數組呢? 是創建傳遞數組的局部var

任何幫助將不勝感激!

您需要區分變量和實際對象(數組)。 splicepush正在改變對象。 arr = []只是更改變量,舊對象保持原樣。

將不同的對象分配給變量或改變當前由變量引用的對象是有區別的。

(Re)的分配

當您執行如下任務時:

arr = []; // or any other value

......然后該值arr以前有沒有改變 只是arr與之前的值分離並引用了一個新值。 原始值(如果它是一個對象)繼續存在,但是arr不再能夠訪問它。

旁注:如果沒有其他變量再引用前一個值,垃圾收集器將在某個時間點釋放它使用的內存。 但這不是你的情況,因為全局變量arrN仍然引用原始值。

變異

這是另一回事,如果你不分配一個值arr ,而是突變適用於它,例如與splicepushpop ,或分配給它的一個屬性,像arr[0] = 1arr[1]++ 在這種情況下, arr保持引用同一個對象,並更改它所引用的對象,這引用同一個對象,就像任何其他變量可見制作arrN

清除陣列

現在,如果要清除傳遞給函數的數組,則必須避免進行類似arr = ...的賦值。 相反,使用改變數組的方法:

arr.splice(0)

或者,或者:

arr.length = 0;

現在你實際上已經改變了數組,這也是arrN引用的數組。

在JavaScript中,特別是在處理對象時,賦值運算符( = )有三個作業。

  1. 分配
  2. 如果右側是對象,則創建新引用。
  3. 如果雙方都是對象,則中斷任何先前的引用並創建多個賦值。

如;

var a = [1,2,3],   // a is assigned an array
    b = a;         // b is assigned just a reference to a
a = ["a","b","c"]; // b to a referral is now broken
                   // a is assigned with ["a","b","c"]
                   // b is assigned with [1,2,3]

如果以相反的順序進行,則同樣適用;

var a = [1,2,3],   // a is assigned an array
    b = a;         // b is assigned just a reference to a
b = ["a","b","c"]; // b to a referral is now broken
                   // b is assigned with ["a","b","c"]
                   // a keeps it's existing assignment as [1,2,3]

你正在將arrN傳遞給控制台而不是傳遞arr 此外,您只需按名稱調用函數,而不是通過關鍵字function 這是更正后的代碼:

var arrN = [1, 2, 3];

function init(arr){
   arr = [];
   console.log(arr) 
}

init(arr);

您還使用參數arr聲明了init() ,在這種情況下不需要。 無論你傳遞給init()的值是什么, arr的值都是[]因為你在函數中重新分配它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM