在 JavaScript 中,只有原始型別為傳值(Call by value)
範例:
var a = 100;
var b = a; // 複製 a 的值,並賦予給 b
b -= 10; // 修改 b 的值
console.log(a, b); // 100 90
從範例中 a
為原始型別,
var b = a
會複製 a
的值來建立新增記憶體位址,
並且讓 b
指向新增記憶體位址當中,
也就是說 a
和 b
都有各自的記憶體位址,
因此修改 b
的值時,a
不會一併修改,
這稱之為傳值(Call by value)
圖解:
也稱為傳參考,在 JavaScript 中,
只有物件型別為傳址(Call by reference)
範例:
var a = {
name: '小明',
};
var b = a;
b.name = 'weiwei';
console.log(a); // {name: 'weiwei'}
console.log(b); // {name: 'weiwei'}
該範例中 a
為物件型別,
而 var b = a
會讓 b
指向 a
的記憶體位址,
因為指向的記憶體位址相同,
因此當 a
或 b
的內容被修改時,
這兩個變數的值都一起會被修改,
這稱之為傳址(Call by reference)
圖解:
再看一個範例:
var family = {
name: '小明',
members: {
dad: 'dad',
mom: 'mom',
}
};
var member = family.member;
member = {
name: 'weiwei',
};
console.log(member); // {name: 'weiwei'}
console.log(family.members); // {dad: 'dad', mom: 'mom'}
該範例結果能看到 member
和 family.members
的值不一樣
那是因為我們在 member = {name: 'weiwei'}
時,
已經將記憶體位址已經指向 {name: 'weiwei'}
了,
因此結果會不一樣
圖解:
以上就是傳值和傳址的內容,感謝觀看!!