javascript 之Rest 引數(...)
阿新 • • 發佈:2018-12-10
概述:
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引數的資料解析後一一對應)不要忘記引數用[] 括起來,因為它陣列嘛
-
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));