welcome to Cheeto's blog

0%

JavaScript核心篇:傳值 & 傳址

傳值 & 傳址

本章參考

傳值

所有的基本型別都是「傳值」。

1
2
3
4
5
var a = 10;
var b = a;

a = 100;
console.log(a, b); // 100, 10

這邊可以看到 b = a 但是a的值改變了之後b卻維持在原位,這是因為基本型別的傳遞是利用複製的,所以 b = a 的值是複製a的值而已。

可以看作ab兩個都是不同的個體。

所以之後a不管做了什麼樣的更新,都跟b不會有任何的關係。這種方式稱為「傳值」。

傳址

所有的物件型別都是「傳址」。接下來就讓我們來看看什麼是傳址吧!

1
2
3
4
5
6
var person = {
name: '小明',
money: 1000
};
var person2 = person;
person2.name = '杰倫';

會變成下面這樣 ↓

傳址測試

為什麼會有這樣的變動呢?我們用下面這個圖片來解釋:

傳址

var person2 = person 的時候,person 其實是把記憶體參考位址傳給了 person2,因為它們都是同一個位址,所以就算 person2 把記憶體參考位址的東西變動了,在同一個位址的 person 也當然會跟著變動了。

而這種方式就稱為「傳址」。


接下來我們看下一個範例

1
2
3
4
5
6
7
8
var person = {
name: '小明'
};
var person2 = person;
person2 = {
name: '小明'
}
console.log(person == person2); // false

讓我們用下圖解釋為什麼會這樣

傳址2

這邊可以看到如果 person2 指向一個新的物件的話,它其實會傳入一個新的位址上。

這時候 personperson2 就不會有任何關聯了。