iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
自我挑戰組

轉職仔與JavaScript的初次相遇系列 第 29

JavaScript傳值或傳址(上) - Day29

  • 分享至 

  • xImage
  •  

前言

今天會針對JavaScript的傳遞資料方式進行解釋介紹

說明

首先先看Primitive type例子

let age = 27;
let oldAge = age;
age = 28;

思考一下這時候的age以及oldAge結果會是如何?

console.log(age); //28
console.log(oldAge); //27

age由於後續重新賦予28的值,所以最終結果是28
oldAge則是在宣告當下值為27,後續也沒有重新賦值,因此最終數值仍然是27


接下來看Reference type例子

const me = {name: ‘Jeremy’,age: 27;};
const friend = me;

後續將friend.age改成30

friend.age = 30;

想一下結果me以及friend的結果會是如何呢?

console.log(me); //{name : ’Jeremy’, age : 30}
console.log(friend); //{name : ’Jeremy’, age : 30}

兩個Object age都變成30了!!! 即使明明只改動friend Object裡頭的age


以下就來解釋背後運作的邏輯

  • Primitive data是儲存在執行上下文(execution context)中的Call stack的位置
  • Reference data則是儲存堆(heap)中

https://ithelp.ithome.com.tw/upload/images/20231013/20162465Iw0JBtuWTo.png
在宣告變數時,JavaScript engine會
1.創建Identifier (創建age這個Identifier)
2.創建一個值的位址 (創建位址0001)
3.在位址上儲存數值 (儲存數值在變數age所引用的記憶體位址0001中)
4.oldAge再指向age的位址
而當我們針對Primitive type進行修改時 (重新賦值age為28)
https://ithelp.ithome.com.tw/upload/images/20231013/20162465PBC0OFIWve.png
此時不會直接更動0001位址的數值,而是會創造一個新的位址並儲存著新數值

在Call stack中,特定位址的數值是不能更動的

傳值(Pass by value)指得是傳遞變數中的值,在上述例子中oldAge的值保持不變,因為它只包含了一開始複製的值,而這就是 "傳值" 的概念。


上一篇
JavaScript的Class Static語法 - Day28
下一篇
JavaScript傳值或傳址(下) - Day30
系列文
轉職仔與JavaScript的初次相遇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言