[英]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);
使用splice
或push
方法時,正在修改傳遞給函數的數組。 所以我試圖理解使用賦值運算符時發生了什么,為什么它不改變數組呢? 是創建傳遞數組的局部var
?
任何幫助將不勝感激!
您需要區分變量和實際對象(數組)。 splice
和push
正在改變對象。 arr = []
只是更改變量,舊對象保持原樣。
將不同的對象分配給變量或改變當前由變量引用的對象是有區別的。
當您執行如下任務時:
arr = []; // or any other value
......然后該值arr
以前有沒有改變 。 只是arr
與之前的值分離並引用了一個新值。 原始值(如果它是一個對象)繼續存在,但是arr
不再能夠訪問它。
旁注:如果沒有其他變量再引用前一個值,垃圾收集器將在某個時間點釋放它使用的內存。 但這不是你的情況,因為全局變量arrN
仍然引用原始值。
這是另一回事,如果你不分配一個值arr
,而是突變適用於它,例如與splice
, push
, pop
,或分配給它的一個屬性,像arr[0] = 1
或arr[1]++
。 在這種情況下, arr
保持引用同一個對象,並更改它所引用的對象,這是引用同一個對象,就像任何其他變量可見制作arrN
。
現在,如果要清除傳遞給函數的數組,則必須避免進行類似arr = ...
的賦值。 相反,使用改變數組的方法:
arr.splice(0)
或者,或者:
arr.length = 0;
現在你實際上已經改變了數組,這也是arrN
引用的數組。
在JavaScript中,特別是在處理對象時,賦值運算符( =
)有三個作業。
如;
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.