ES6 引入 rest 參數(形式為“...變量名”),用於獲取函數的多余參數,這樣就不需要使用arguments
對象了。rest 參數搭配的變量是一個數組,該變量將多余的參數放入數組中。(可以拿到除開始參數外的參數)
這個rest 參數和arguments不一樣,它是程序員自定義的一個普通標識符,只是需要在前面加上三個點:...
function
func(a, ...rest) {
console.log(a)
console.log(rest)
}
func(1) // 1 []
func(1, 2, 3, 4) //1 [2,3,4]
又比如,在前面定義2個參數
function
func(a, b, ...rest) {
console.log(a, b)
console.log(rest)
}
func(1, 2) // 1 2 []
func(1, 2, 3, 4) 1 2 [3,4]
注意:剩余參數后面不能跟其他參數,否則會報錯
function
func(a, ...rest, b) {
}//報錯
當使用剩余參數后,函數的length屬性會發生一些變化
function
func(a, b, ...rest) {
}
func.length
// 2
即length不包含rest,為2。
剩余參數前面可以不跟其他參數,即一個參數也沒有。如
function
func(...rest) {
console.log(rest)
}
func(1)
// [1]
func(1, 2, 3, 4)
// [1,2,3,4]
注意:rest不能和arguments一起使用,會報錯
function
func(...rest) {
console.log(rest)
console.log(arguments)
}
那么rest和arguments的區別是什么呢?
- arguments是一個偽數組(Array-like)
- 剩余參數是一個真正數組(Array),具有Array.prototype上的所有方法
- arguments上有callee,callee上有caller
如:
function
func(a, ...rest) {
console.log(rest
instanceof
Array)
}
func(1, 2)
// true
rest 實際應用
//求和函數
function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum; } add(2, 5, 3) // 10
上面的代碼相當於以下代碼
function
sum(first, ...rest) {
var
result = first
var
i = 0
var
len = rest.length
while
(i < len) {
result += rest[i]
i++
}
return
result
}
sum(1, 2, 3) //6