javascript函式引數引用型別傳遞其實也是一個複製過程

admin發表於2017-03-31

在函式進行值型別引數傳遞的時候,引數會進行一個拷貝,這一點毋庸置疑,看如下程式碼:

[JavaScript] 純文字檢視 複製程式碼
var a=1;
function func(num){
  num=num+1;
  console.log(num)
}
func(a);
console.log(a);

上面的程式碼的輸出值分別是2和1。值型別資料傳遞的時候,是做了一份拷貝,也就是說會在棧記憶體中重新開闢一個區域儲存拷貝的資料,於是函式外宣告的變數a和傳遞到函式內的資料已經完全互補相關。下面再看一下引用傳遞的程式碼:

[JavaScript] 純文字檢視 複製程式碼
var obj={
  webName:"螞蟻部落",
  url:"softwhy.com"
}
function func(obj){
  obj.address="青島市南區";
}
func(obj);
console.log(obj.address);

上面的程式碼典型的引用傳遞,給函式傳遞的引數是物件的引用,也可以說是物件在堆中的儲存地址。不過在傳遞引數的這個過程也是一個複製過程,會對儲存在棧中的儲存物件引用的變數進行一個拷貝,也就是傳遞到函式中的也是一個全新的資料,只是這個資料指向同一堆中的記憶體地址而已。

相關文章