1. 程式人生 > >javascript 之Rest 引數(...)

javascript 之Rest 引數(...)

概述:

      Rest就是為解決傳入的引數數量不一定, rest parameter(Rest 引數) 本身就是陣列,陣列的相關的方法都可以用。

1.語法:

function f(a, b, ...theArgs) {

// ...

}

2.描述:

theArgs以“...”開頭,它是一個數組,它的值來自於實際呼叫者傳入[0,theArgs.length)  (索引的範圍:0到theArgs.length-1)

3.區分rest引數和 引數物件

  • rest引數不會為每個變數給一個單獨的名稱,引數物件包含所有引數傳遞給函式
  • 引數物件不是真正的陣列,rest引數是真實的陣列例項。例如陣列sort、map、forEach、pop的方法都可以直接使用
  • 引數物件有他自己額外的特性(例如callee 屬性)

4.從引數變成陣列

Rest引數的引入減少樣式程式碼。

//以前函式

function f(a, b) {

var args = Array.prototype.slice.call(arguments, f.length);


// …

}


// 等效於現在


function f(a, b, ...args) {


}

5.Rest引數可以被解構(通俗一點,將rest引數的資料解析後一一對應)不要忘記引數用[] 括起來,因為它陣列嘛

  1. function f(...[a, b, c]) {
    
    return a + b + c;
    
    }
    
    
    f(1) //NaN 因為只傳遞一個值,其實需要三個值
    
    f(1, 2, 3) // 6
    
    f(1, 2, 3, 4) // 6 (第四值沒有與之對應的變數名)

6.例子走起

計算rest引數的長度,驗證是否直接可以用陣列的方法

function fun1(...theArgs) {

console.log(theArgs.length);

}


fun1(); // 0

fun1(5); // 1

fun1(5, 6, 7); // 3

每個引數乘以2

function multiply(multiplier, ...theArgs) {

return theArgs.map(function(element) {

return multiplier * element;

});

}


var arr = multiply(2, 1, 2, 3);

console.log(arr); // [2, 4, 6]

排序

function sortRestArgs(...theArgs) {

var sortedArgs = theArgs.sort();

return sortedArgs;

}

//好像一位和兩位混合不能進行排序,這需要看一下為甚?主要第一個為主

console.log(sortRestArgs(5, 3, 7, 1)); // shows 1, 3, 5, 7

對於引數物件arguments不能排序

function sortArguments() {

//arguments是引數物件不能直接使用sort()方法,因為不是陣列例項,需要轉換

var sortedArgs = arguments.sort();

return sortedArgs; // this will never happen

}


// 會丟擲型別異常,arguments.sort不是函式

console.log(sortArguments(5, 3, 7, 1));