函式的參數--傳值或傳址
- 詳細內容
- 分類:Javascript
- 發佈:2013-06-11, 週二 11:38
- 點擊數:2750
函式的參數--傳值或傳址:
函式的參數是用來與程式本體進行資料傳遞使用。一般傳遞參數的方式分為傳址或傳值。但Javascript不像C一樣,有特殊的運算子來決定傳值或傳址。而是以資料型態作為依據。
對Javascript而言,函式參數的資料型態若是基本的資料型態,像是數值,字串,布林值,則會是以傳值的方式來進行傳遞,而當參數若是物件時則是以傳址來進行。
下面用一個範例來看看其差別:
<script type="text/javascript">
var x=5;
var mystr="string-1";
var myarray= [ "Array0-1" , "Array0-2" ] ;
var myobj={
objstr:"test"
}
function changetest(intx,mystr,myattay,myobj){
intx=7;
mystr="string-2";
myarray[myarray.length]="Array0-3";
myobj.objstr="test2";
}
changetest(x,mystr,myarray,myobj);
document.writeln(x);
document.writeln("<br/>");
document.writeln(mystr);
document.writeln("<br/>");
document.writeln(myarray);
document.writeln("<br/>");
document.writeln(myobj.objstr);
document.writeln("<br/>");
</script>
輸出:
5
string-1
Array0-1,Array0-2,Array0-3
test2
string-1
Array0-1,Array0-2,Array0-3
test2
很明顯看得出來,基本資料型態的數值,字串都無法在函式中改變其值,原因就是因為參數傳遞的方式是傳值。而陣列與物件可以在函式中改變其值,原因是因為函式傳遞的方式是傳址。
PS:
傳值:
將變數的值傳遞至涵式內,因為是單純將"值"傳遞給函式,所以其實函式內的變數與原本變數是不同的2個變數,只是在開始時擁有相同的數值,在函式內改變其值並不會引響函式外的變數。
傳址:
將變數的位址傳遞至函式,函式內的變數與函式外的變數都是存取相同的變數位址。因此在函式內改變該值時,函式外的值也會改變。
觀念澄清:
我想在這裡特別說一下,所謂的傳址是以位址來做為傳遞。因此函式外的變數與函式內的變數,雖然是不同的變數,但是指向相同的位址。在這種情況下,用函式內的變數做為索引來改變位址內的資料,會引響到函式外的值。但是如果在函式內改變了函式內變數的參考位址。譬如說新定義了一個物件給變數,像這樣的改變就不會引響到函式外的變數。因為你已經給了函式內的變數一個新的索引了。圖解如下: