### 函數-動態參數 / arguments: - 此狀況,使用於你也不曉得初期函式裡頭要持有幾個參數 但是呢,可以透過這個方式動態的賦予參數。 - `arguments` , 是一個只存在於 函式裡面的值。 - 且,會發現他是一種陣列的型態,但是一種偽陣列。 ```javascript // 動態參數 function getSum() { console.log(arguments); // 14 16 } getSum(14, 16); 結果: Arguments(2) 0: 14 1: 16 ``` ### 有了動態參數,那麼就只剩+總: - 且可發現,我們只需要做一次動態參數的迴圈相加 外部執行 getSum,無論幾組、輸入幾次數值 都可以反覆被應用來計算,非常方便。 ``` javascript // 動態參數 function getSum() { console.log(arguments); let sum = 0; // 初始數值 for (i = 0; i < arguments.length; i++) { // 初始化:0 ; 限制 i 跑的長度; 在<長度限制內執行1次 i++ // ex: 假設長度是3, 則從0開始跑至2 , 使此筆陣列的索引值做一個相加。 sum += arguments[i]; } console.log(sum); // 14+16 = 30 // 9999+10000+3000 = 22999 } getSum(14, 16); getSum(9999, 10000, 3000); ``` - 結語: - 動態參數 `arguments`,用來解決不知道用戶預計要使用幾筆參數 放置在函式,則可以這樣來處理加總問題! - `arguments`,本質是一個**偽陣列**,**只存活於函式內**。 --- ### 函數-剩餘參數,求加總: - 剩餘參數的作法: ()內下參數名稱 - 可任意取名但記得這樣輸入 - ... 參數名,詳細如下 ```javascript // 剩餘參數 function getSum(...arr) { let sum = 0; for (let i = 0; i < arr.length; i++) { // 透過 for 迴圈來下 arr[i] 跑整筆陣列即可 sum += arr[i]; } console.log(sum); // 6 } getSum(1, 2, 3); ``` ### 那麼,動態參數與剩餘參數加總的差異在哪? - 剩餘參數的妙用: - 參數以後的 ... 都變成[陣列] - 下列參數內有: a,b 而 a,b 對應值為 1,2 - ... 之後的 3,4,5 自動變成了陣列 - `arr` ```javascript // 剩餘參數 function getSum(a, b, ...arr) { let sum = 0; for (let i = 0; i < arr.length; i++) { sum += arr[i]; } console.log(sum); // 12 } getSum(1, 2, 3, 4, 5); // [3,4,5] ``` - 故,執行了 getSum(1,2,3,4,5) - sum 實際上是+總了 3+4+5 = 12 #### 剩餘參數與動態參數的差異在於 - 剩餘參數,是真實的陣列,實際開發應用時 - 建議使用剩餘參數方法。 - 剩餘參數 & 動態參數一樣,都只能存在於 function 裡面。 --- ### 展開運算子 - 應用 - 展開運算子,也是以 `...`方式來寫的 - 很像**剩餘參數** ```javascript // 展開運算子 const arr = [1, 2, 3]; console.log(...arr); // 1 2 3 // 可是你這樣寫,實際上是沒意義的對吧? ``` - 搭配 Math.max() & Math.min(): ```javascript // 展開運算子 const arr = [1, 2, 3]; // 透過數學方法 ,取出陣列裡面的最大值 console.log(Math.max(...arr)); // 3 // 透過數學方法 ,取出陣列裡面的最小值 console.log(Math.min(...arr)); // 1 ``` - 為什麼需要展開? ``` 因為呢,arr 本身是一組陣列 你若不展開的話,他只能是一個陣列對吧? 透過展開 ... 陣列裡面的值,就變成 真數值 也就可以取得了。 ``` ### 展開運算子,合併陣列大法: - 將兩組陣列直接合併的妙法 ```javascript // 展開運算子 const arr1 = [1, 2, 3]; // 透過數學方法 ,取出陣列裡面的最大值 console.log(Math.max(...arr1)); // 3 // 透過數學方法 ,取出陣列裡面的最小值 console.log(Math.min(...arr1)); // 1 // 展開運算 - 合併陣列 const arr2 = [3, 4, 5]; // 宣告一個變數,作為合併兩筆陣列: const arr = [...arr1, ...arr2]; console.log(arr); ``` ### 結語 - 展開運算子,是用來將陣列給展開 - 可以求最大值`Math.max()`、最小值`Math.min()` 也可以合併陣列。 - 剩餘參數,可以將陣列裡頭剩餘的陣列值給合併成陣列。 - 僅存活於函式內。