### 傳值與傳參考的意義是什麼? - **傳值**(Pass by Value)和 **傳參考**(Pass by Reference)是在程式設計中用來**描述函數或方法如何將參數傳遞給其他函數或方法的方式**。這兩者之間的**區別在於參數在傳遞過程中的內存管理方式**。 ### 示例: - 假設今天有一個 **a 變數** & **b 變數** - b 是預計來拷貝資料 a 的變數。 ```js // Primitive value , Copy of primitive value b = a; (or pass to a function) ``` ### by value - 簡單來說,藉由傳值獲取的值,若原先指向的變數與值有改變 ,當下這個值就不能被改變。 - 而這個案例只有在純值的情況下發生。[Primitive value](https://developer.mozilla.org/en-US/docs/Glossary/Primitive) ```js // 假設 a = 3; 也就是說,b 會指向 3,而這個 3 就是拷貝的位置。(獲得與 a 相同的值)。 // 這是一個 by value 的示例 ``` - **by value** 案例: ```js let a = 1; let b = a; a = 3; console.log(b); // b 沒有因為 a 中途改變值 = 3; 也跟著變化。 ``` ### by reference - 所有的**物件**都是 **by refernece**。像是函數,函數在 JavaScript 也是物件。 - 開發時,**若兩個變數都指向同個物件**,假設 `a` 有變化,那拷貝變數 a 的 變數 `b` 則也會被影響。 ```js const obj = { content: "hi,obj!", }; let a = obj; console.log("a", a); // b 拷貝了 a let b = a; console.log("b", b); a.content = `I m 'a',first change the value!`; console.log(obj, a, b); // obj - 不變 , b 因為受到 a 影響,所以值改變了。 ``` ### 純值代表了一個記憶體的位置。 - 因為上面的案例已經告訴你了,拷貝純值的話,後續來源值有變動,拷貝變數不會被影響到。 ### by reference 不會創建一個記憶體,但會將拷貝變數指向同個記憶體位址 - [延伸參考文章](https://ithelp.ithome.com.tw/articles/10209104) - [延伸參考教學](https://www.youtube.com/watch?v=r5rYoJFWfN0&t=1008s)