在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出來的應該是「大黃」了。 對象