iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0

挑戰接近尾聲,
好像也來不及多做甚麼,
今天先針對程式面來分享一些心得,
這次在設計這個元件,
用到很多引用跟拷貝的概念,
以前可能搞不懂甚麼是傳址傳值,
也不懂為什麼要這麼麻煩,
直到開始做這種層層包覆的元件,
就會發現引用的重要。

引用的使用可以促進程式內不同部分的縱向溝通,
因為物件的引用傳遞允許多個變數指向同一個內存中的物件。
但這也會引發一些潛在問題,尤其是在對程式不夠熟悉的情況下,
開發者可能難以確定是哪一層的物件發生了變更。
這時就需要借助 console.log 來跟蹤每個階段的資料狀態。
然而,console.log 打印出來的結果有時並不是即時反映內存中的變化,
這可能是因為 JavaScript 的異步機制或者對象的引用行為,
因此有時候需要使用中斷點(breakpoint)來更精確地查看執行時的狀態。

在這邊簡單描述一下引用,
在 JavaScript 中,引用意味着傳址操作。
當你創建一個基本類型(如 number、string)的變數時,
系統會複製該值並存儲在一個新的內存地址。每次賦值都會創建一個獨立的副本。
然而,當你創建一個物件(如 Object、Array 或 FormGroup),
這些複雜的資料類型在內存中儲存的是對內存地址的引用。
如果你將一個物件賦值給另一個變數,這兩個變數實際上指向同一個內存地址。
換句話說,它們共享同一個物件。

因此,對其中一個變數進行修改,會影響到另一個變數,
因為它們引用的是相同的內存位置。

這次元件設計用了不少引用,主要是最外層會有一個主物件,
會把子物件傳到元件裡面,元件變更狀態的時候主物件也會跟著調整,
當然也有一些特殊狀態會需要在用valueChanges去更新狀態,
不過我自己覺得valueChanges能越少使用越好,除非真的很了解,

那還有一些情況其實是要避開引用的,,
這種時候就要用拷貝,
通常可能是在賦值的時候初始化一個新的物件再塞值,
像是

this.obj1={...this.obj2}

上面就是一個新的元件然後把obj2的值放進去,
一般在使用有時候會直覺用this.obj1=this.obj2,
然後在對obj2做動作的時候obj1也會跟著變動,
這是往往會忽略掉的部分。
以上是今天的廢話,就沒有程式了,明天進入最後一天


上一篇
第28天 設定設定檔
下一篇
第30天 結語
系列文
簡單的事 最困難-Angular動態Form元件30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言