按值傳遞和引用傳遞

2021-09-24 09:12:57 字數 925 閱讀 2453

最近在看到函式按值傳遞還是引用傳遞的時候產生了困惑,突然想到這個問題好像從第一次看紅寶書就一直有這個困惑,於是各種搜,但是網上的種種回答也很不相同,想了兩天終於算是有個理由可以說服自己了。我們先不討論按值傳遞和引用傳遞的名字的定義,很多時候都是被名字的定義誤導了。

實質重於形式,名字可以有很多,我們就不討論到底該叫什麼。只想說在現代的語言中引數的傳遞方式只有按值傳遞了,比如js,沒有引用傳遞。我當時比較困惑是將引用型別的複製當成了引用傳遞,準確的講這應該叫引用訪問,好像這是文字遊戲的感覺。下面來簡單的說一下。

js的值分為基本型別和引用型別

當我們訪問乙個物件的時候,首先得到的是從棧中找到的該物件在堆記憶體中的位址,然後按照位址去獲取物件中的值。

當我們複製基本型別變數和引用型別變數的時候

基本型別的複製:

引用型別的複製:

當我們傳遞引用型別的引數時,就是引用型別的複製,函式的形參還是和實參指向了同乙個引用型別,此時操作變數是操作的變數的引用,當給物件新增屬性的時候,操作的是堆記憶體中實際的物件。我們可以認為是按位址傳遞

當我們操作變數的時候,實際是:

所以我們就可以理解下面的這些**了:

function setname(obj) 

var person = new object()

setname(person)

console.log(person.name) // zhangsan

複製**

function setname(obj) 

var person = new object()

setname(person)

console.log(person.name) // zhangsan

複製**

所以說函式是按值傳遞引數,js沒有引用傳遞

按值傳遞和按引用傳遞

對於基本型別而言,是按值傳遞的 基本型別儲存在棧中 基本型別引數的傳遞和基本型別的複製一樣,傳遞的是值本身 var a 1 function test x test a console.log a 1按值傳遞的意思就是形參是實參的複製,形參實參互不干擾 so,雖然在函式test中a被修改,但是並沒有...

Java按值傳遞和按引用傳遞

如果傳遞引數是基本型別或其包裝類,則按值傳遞,改變引數的值,實際引數的值不變。public static void main string args public static void changei integer i 如果傳遞引數是類或陣列,則按引用傳遞,改變物件的引用,實參的引用不會改變,但...

C 值傳遞和按引用傳遞

知識點 值型別和引用型別 為值型別,據 對於引用型別來說,棧中儲存的是堆中物件的位址 值傳遞和引用傳遞 對於值傳遞,傳遞的是棧中儲存的資料 對於引用傳遞。傳遞的是棧本身的位址 先看一下值傳遞 傳遞值型別和引用型別 class program 值型別的值傳遞 static void d1 int m ...