基本類型和引用類型的值 函數的傳遞參數

ECMAScript中函數的傳參都是按值傳遞的。

不論是傳基本類型的值仍是引用類型的值都是按值傳遞,訪問變量則分按值和按引用兩種方式。javascript

向參數傳遞基本類型的值

被傳遞的值會被複制(對應文章《基本類型和引用類型的值--複製變量值》)給函數內部的一個局部變量。(即命名參數,也就是argument對象的一個元素)java

function addTen(num){
    num += 10;
    return num;
};
var count = 20;
var result = addTen(count);
alter(count); //20,沒有變化
alter(result); //30
複製代碼

函數addTen的一個參數num,其實是函數addTen內部的一個局部變量,僅僅供函數內部使用,count只是將其值複製了一份給了局部變量num。兩個變量互不影響。函數

向參數傳遞引用類型的值

被傳遞的值會被複制(對應文章《基本類型和引用類型的值--複製變量值》)給函數內部的一個局部變量,(即命名參數,也就是argument對象的一個元素)和傳遞基本類型的值同樣。不一樣的是這裏的值應該是指引用類型的值對應的內存地址。ui

function setName(obj){
    obj.name = 'Zeng';
};
var preson = "John";
setName(preson);
alter(preson.name); //"Zeng"
複製代碼

這樣一來,obj和preson引用的是同一個對象。改變obj,就會改變preson,這兩個對象指向的對象在堆內存中只有一個。spa

爲何不是按引用傳遞的呢?code

function setName(obj){
    obj.name = 'Zeng';
    obj = new Object(); //一個新的對象從新賦值給obj,這樣obj和preson引用的就不是同一個對象了。此時的obj和preson互不影響。
    obj.name = 'Sam';
};
var preson  = new Object();
setName(preson);
alert(preson); //Zeng
複製代碼
相關文章
相關標籤/搜索