自學日記

學習程式相關知識及學習法

0%

傳值與傳參考(Call by value & Call by reference)

傳值與傳參考(Call by value & Call by reference)

了解兩者差異,幫助在開發時減少bug問題

純值為傳值,物件、陣列、函式為傳參考

傳值(by value)

演示圖:

由上圖所示,創造出新的記憶體,值被導向新的位置。
演示程式:

1
2
3
4
5
6
7
8
9
10
11
var a = 3;
var b;

b = a;
//console.log(a);//3
//console.log(b);//3
a = 2;


console.log(a);//2
console.log(b);//3

由上述程式碼可以說明,由於導向不同記憶體,因此在之後a再度變更值後,a與b的值會不同。

傳參考

演示圖:

由上圖所示,並無新物件被創造,也都導向同一個記憶體。
演示程式:

1
2
3
4
5
6
7
8
var a = { say: 'hi'};
var b;

b = a;
a.say = 'hello';

console.log(a);//hello
console.log(b);//hello

由上述程式碼可知,由於導向同一個記憶體,因此在變更物件值後,兩者同時更換為新值。

function也是如此:

1
2
3
4
5
6
7
8
9
10
11
12
var a = { say: 'hi'};
var b;

b = a;

function changesay(obj) {
obj.say = 'Ha';
}

changesay(b);
console.log(a);//Ha
console.log(b);//Ha