iT邦幫忙

2021 iThome 鐵人賽

DAY 19
1
自我挑戰組

JavaScript 核心觀念系列 第 19

【Day19】傳值和傳址(傳參考)

傳值(Call by value)

在 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 指向新增記憶體位址當中,

也就是說 ab 都有各自的記憶體位址,

因此修改 b 的值時,a 不會一併修改,

這稱之為傳值(Call by value)

圖解:

傳址(Call by reference)

也稱為傳參考,在 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 的記憶體位址,

因為指向的記憶體位址相同,

因此當 ab 的內容被修改時,

這兩個變數的值都一起會被修改,

這稱之為傳址(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'}

該範例結果能看到 memberfamily.members 的值不一樣

那是因為我們在 member = {name: 'weiwei'} 時,

已經將記憶體位址已經指向 {name: 'weiwei'} 了,

因此結果會不一樣

圖解:

以上就是傳值和傳址的內容,感謝觀看!!


上一篇
【Day18】物件與純值
下一篇
【Day20】淺層複製及深層複製
系列文
JavaScript 核心觀念30

尚未有邦友留言

立即登入留言