# 其餘參數(剩餘參數 **rest parameter**)、展開運算子(Spread operator) >整理編輯: Jung >參考文章: [透過 ESLint 練習 JavaScript ES6 系列-江江好](https://ithelp.ithome.com.tw/users/20119924/ironman/2235) :::spoiler 這邊兩篇連結在同一篇,是因為篇幅不會太長,且也更容易理解兩者的應用 ::: ## 其餘參數(剩餘參數 **rest parameter**) :::info 在有些情況,Function 有不確定數量的參數時,ES6 提供的「剩餘參數」就可以幫助我們很容易 取得剩餘的所有參數,並保存在陣列裡! ::: >- 取得剩下的參數,並存為一個陣列。 >- 剩餘參數在傳入時,必定是位於最後一位,並且只能有一個剩餘參數。 >- 剩餘參數的值在沒有傳入實際值時,會變為一個空陣列,而不是undefined。 >- 又叫做「剩餘運算子」「其餘參數」「其餘運算子」 >- ESLint(airbnb)規則:不要使用 ==arguments== 語法,使用 rest 語法 ==...== 替代 --- #### 基本使用方式 > 函式中,最後一個參數命名開頭使用 ... 當開頭,就會將當前位置~最後一個變數組成陣列 ```javascript= function f(a, b, ...變數名稱) { //... } ``` #### 將所有參數轉成陣列 > 範例:有一組套餐set,將套餐的內容組成陣列 ```javascript= let set = function(...food){ console.log(food) // ['薯條','壽司','可樂','雞塊','牛肉漢堡','蘋果派'] } set('薯條','壽司','可樂','雞塊','牛肉漢堡','蘋果派'); ``` #### 將所有參數轉成陣列 > 假如阿華要吃套餐的前兩樣產品,映萱吃掉剩下的所有餐點,我們就可以這樣寫 > ```javascript= let set = function(first,second,...food){ console.log(first); // 阿華要吃的第一樣 - 薯條 console.log(second); // 阿華要吃的第二樣 - 壽司 console.log(food); // 映萱要吃剩下全部 - ["可樂", "雞塊", "牛肉漢堡", "蘋果派"] } set('薯條','壽司','可樂','雞塊','牛肉漢堡','蘋果派'); ``` >如果function有先定義別的參數,就會將傳入的參數值先給定義好的參數,剩下的就全部塞入其餘參數,所以前兩個參數會分別帶入「薯條」與「壽司」,映萱要吃的剩餘食物就會被轉成陣列囉~ > #### 將剩餘參數做運算 >今天美食街的所有產品都打85折,映萱吃完一圈吃後,想來算看看每餐都花了多少錢 > ```javascript= let count = function(disCount,...food){ return food.map(food => disCount * food); // disCount 儲存參數 0.8 // food 儲存所有食物金額,格式為陣列 // 使用陣列內建的map方法做計算 } console.log(count(0.8,160,200,60,80,50,160)); // 取得打折後的金額 [128, 160, 48, 64, 40, 128] ``` --- > ## 展開運算子(Spread operator) :::info 展開運算子,是把陣列裡面的值取出,並拆解成一個一個的獨立參數,和剩餘參數的使用方式一樣都是 ==...==。 ::: #### - 基本用法:陣列/字串拆解 用在陣列會把每個值拆出來,並用逗號隔開,如果用在字串的話,也會把每個字符拆開。 ```javascript= //陣列 let week = [1,2,3,4,5,6,7]; console.log(...week); // 1,2,3,4,5,6,7 //字串 let str = 'IAmSoCute'; console.log(...str); // "I","A","m","S","o","C","u","t","e" ``` #### - 可以用來複製陣列 以映萱的減肥餐為例,假如明天的菜單要跟今天一樣,就可以這樣寫: ```javascript= let today = ['沙拉','水煮雞胸']; let tomorrow = [...today]; console.log(tomorrow); // ['沙拉','水煮雞胸'] ``` #### - 可以用來組合兩個陣列 在過去我們如果要把兩個陣列組合成一個陣列時,會使用concat語法。 假如映萱要整理今天中午跟晚上的減肥菜單總共吃了哪些食物,在過去就會這樣寫: ```javascript= let dinner = ['雞胸肉', '沙拉']; let lunch = ['大陸妹','水煮蛋','和風醬']; let todayFood = dinner.concat(lunch); console.log(todayFood); // ["雞胸肉", "沙拉", "大陸妹", "水煮蛋", "和風醬"]; ``` 而使用展開運算子的語法,可以很輕易的連結兩個陣列,像這樣: ```javascript= let dinner = ['雞胸肉', '沙拉']; let lunch = ['大陸妹','水煮蛋','和風醬']; let todayFood = [...dinner, ...lunch]; console.log(todayFood); // ["雞胸肉", "沙拉", "大陸妹", "水煮蛋", "和風醬"]; ``` #### - 把陣列傳入函式做運算 我們可以把陣列的值展開,傳入函數的參數中做運算。 假如映萱想要計算今天的減肥餐總共花了多少錢,就可以這樣寫: ```javascript= function count(breakfast, lunch, dinner) { return breakfast + lunch + dinner; } var price = [10, 50, 20]; console.log(count(...price)); // 80 ``` ###### tags: `JavaScript` `剩餘參數` `其餘參數` `展開運算子`