JavaScript剩餘操做符Rest Operator

本文適合JavaScript初學者閱讀

剩餘操做符

以前這篇文章JavaScript展開操做符(Spread operator)介紹講解過展開操做符。剩餘操做符和展開操做符的表示方式同樣,都是三個點 '...',可是他們的使用場景會不一樣。前端

剩餘參數

定義函數的時候,若是函數的參數以… 爲前綴,則改參數是剩餘參數(rest parameter)。剩餘參數表示參數個數不肯定的參數列表。在函數被調用時,該形參會成爲一個數組,數組中的元素都是傳遞給該函數的多出來的實參的值。程序員

獲取參數

剩餘操做符能夠用來方便地獲取傳進來的參數。編程

function sum(a,b,...args){
  console.log(args.length); // 傳進來的參數的個數 3
  let s = a + b;
  if(args && args.length){
      args.forEach(i => {s += i});
  }  
 return s;
}
sum(1, 2, 3, 4, 5 ); // 傳進來的參數的個數 3

其中第一個形參a對應的是1,第二個形參b對應的2,…args表示的就是[3, 4, 5]。數組

和arguments的差異

上面剩餘參數args是一個數組,而函數的arguments是一個僞數組。應此剩餘參數可使用數組的相關方法sort,map,forEach,pop,而arguments不能。架構

arguments想要變成數組,能夠經過Array.prototype.slice.call方法,使用剩餘操做符能夠避免將arguments轉爲數組的麻煩。函數

// 下面的代碼模擬了剩餘數組
function sum(a,b,){
  var args = Array.prototype.slice.call(arguments, sum.length);  
  console.log(args.length); // 傳進來的參數的個數 3
  let s = a + b;
  args.forEach(i => {s += i});
 return s;
}
sum(1, 2, 3, 4, 5 );

而使用剩餘操做符,則不須要轉化,直接使用,更加方便。職業規劃

剩餘操做符與解構賦值

咱們知道,ES6 容許按照必定模式,從數組和對象中提取值,對變量進行賦值,這被稱爲解構(Destructuring)。 好比以下代碼:spa

let array = [1,2,3]
let [a,b,c] = array; // a 1, b 2, c 3

再好比以下代碼:prototype

let obj = {a:1,b:2,c:3}
let {a,b,c} = obj; // a 1, b 2, c 3

在解構賦值時,可使用剩餘操做符。剩餘操做符所操做的變量會匹配在解構賦值中全部其餘變量未匹配到的屬性。
好比以下代碼,others會匹配到first和second對於屬性的餘下的屬性:3d

const { first, second, ...others } = {
  first: 1,
  second: 2,
  third: 3,
  fourth: 4,
  fifth: 5
}

first // 1
second // 2
others // { third: 3, fourth: 4, fifth: 5 }

對象中餘下的屬性值被打包起來構造一個新的對象賦值給了others

數組也能夠經過剩餘操做符,把剩餘的元素打包成一個新的數組賦值給剩餘屬性,代碼以下:

let array = [1,2,3,4,5];
let [a,b,...c] = array;  // a 1,b 2, c [3,4,5]

剩餘操做符和展開操做符

某種程度上,能夠任務剩餘操做符是展開操做符的相反操做。展開操做符會」展開「數組編程多個元素,剩餘操做符會把多個元素壓縮成一個單一的元素。

歡迎關注公衆號「ITman彪叔」。彪叔,擁有10多年開發經驗,現任公司系統架構師、技術總監、技術培訓師、職業規劃師。熟悉Java、JavaScript。在計算機圖形學、WebGL、前端可視化方面有深刻研究。對程序員思惟能力訓練和培訓、程序員職業規劃和程序員理財投資有濃厚興趣。

ITman彪叔公衆號

相關文章
相關標籤/搜索