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
