js函式引數值傳遞和引用傳遞簡單介紹

admin發表於2017-03-31

在javascript中,函式引數的傳遞分為值型別傳遞和引用型別傳遞,下面就分別通過程式碼例項做一下介紹。

一.值型別傳遞:

值型別的資料儲存在棧中,看如下程式碼:

[JavaScript] 純文字檢視 複製程式碼
var num=5;

宣告一個值型別的變數的時候,會在棧中自動分配此變數型別佔用的記憶體空間,並儲存這個變數所包含的值。

下面來看一個關於值型別傳遞的程式碼例項:

[JavaScript] 純文字檢視 複製程式碼
function done(num){  
   num+=10;  
   return num;  
}  
num=10;  
console.log(done(num));  
console.log(num);

上面的程式碼會分別輸出20和10,下面分析一下為什麼會出現這種情況。

值型別的傳遞,其實就是對棧中的資料做了一個拷貝,外面宣告的變數num和傳遞的引數雖然具有相同的值,但是兩個資料分別被儲存在不同的記憶體地址中,所以兩者互不相關。

二.引用型別傳遞:

先看一段程式碼例項:

[JavaScript] 純文字檢視 複製程式碼
var obj={
  webName:"螞蟻部落",
  url:"softwhy.com"
}

上面的程式碼建立了一個object物件,並將其引用儲存在變數obj中。

引用型別的資料儲存在堆中,但是儲存它引用地址的變數儲存在棧記憶體中。

下面看一段程式碼例項:

[JavaScript] 純文字檢視 複製程式碼
function done(obj){  
  obj.webName="螞蟻部落";  
  obj=new Object();  
  obj.webName="antzone";  
}  
var obj=new Object();  
done(obj);  
console.log(obj.webName);

上面程式碼的輸出值是"螞蟻部落"。之所以是這個結果是因為,當為done函式傳遞引數的時候,也同樣對棧中的引用做了一份拷貝(僅僅是拷貝了一份引用),指向的還是同一個堆中的物件。所以上面的程式碼分析如下:

1.obj.webName="螞蟻部落",這裡的obj是指向函式外部建立的物件,並給此物件新增一個屬性。

2.obj=new Object(),建立一個全新的物件,物件的引用儲存在變數obj中,這個時候obj指向的就不是外部建立的物件了。

3.obj.webName="antzone",為新物件新增屬性。

4.console.log(obj.webName),這裡的obj儲存的依然是外部建立物件的引用,所以輸出值是"螞蟻部落"。

相關文章