前端學習之——js函數參數按值傳遞

在JavaScript裏函數參數能夠任何類型,對於非引用類型的變量以值傳遞很好理解,在向參數傳遞基本類型的值時,被傳遞的值會被複制給命名參數,即arguments對象數組的中一個元素,以下:javascript

var a = 1;
function add(num){ num++; return num; } var b = add(a);
console.log(c); //2
console.log(a); //1 未改變

這能夠看出在把a以參數傳給add函數時,先把a複製一份傳給argument命名參數,根據基本類型數據的特性,複製基本類型數據後是徹底兩個獨立的個體,只是值相同而已,互不影響。java

接下來看若是參數爲複雜類型數據,如object時,以下:數組

var obj = {
    name: "小白"  
}
function change (obj) {
  obj.name = "小黑";
  return;
}
change(obj);
console.log(obj.name); //小黑

這樣乍一看好像是引用傳參,但寫下來在看下列代碼:  函數

var obj = {
    name: "小白"  
}
function change (obj) {
  obj.name = "小黑"
  obj = new Object();   obj.name = "大黃";   return; }
change(obj); console.log(obj.name); //小黑

其實當參數爲引用類型數據時,它也是按值傳遞的,只是根據對象的特性,但複製一份obj時,兩個對象都指向同一個地址,所以在第二個代碼示例裏,change裏改變了obj.name時,它指向的地址也被改變,全局變量obj的name屬性天然也改變了。第三個代碼示例裏也證實了js函數參數是按值傳遞,若是是引用傳參的話,第三個代碼示例結果的console出來的應該是「大黃」了。  對象

相關文章
相關標籤/搜索