es6 引入了rest參數(形式:...變量名),用於獲取函數的多余參數,這樣就不需要使用arguments對象了。rest參數搭配的變量是一個數組,該變量將多余的參數放入數組中。
function add(...values) { let sum = 0 for(var val of values) { sum += val } return sum } add(2, 3, 4) // 9
上面的代碼的add函數是一個求和函數,利用reat參數,可以向該函數傳入任意數目的參數。
下面是一個rest參數代替arguments變量的例子。
// arguments變量的寫法 function sortNumbers() { return Array.prototype.slice.call(arguments).sort() } // rest參數的寫法 const sortNumbers = (...numbers) => numbers.sort()
上面代碼的兩種寫法,比較后可以發現,rest參數的寫法更自然也更簡潔。
arguments對象不是數組,而是一個類似數組的對象。所以為了使用數組的方法,必須使用Array.prototype.slice.call先將其轉為數組。rest參數就不存在這個問題,它就是一個真正的數組,數組特有的方法都可以使用。下面是一個利用rest參數改寫數組push方法的例子。
function push(array, ...items) { items.forEach(function(item) { array.push(item) console.log(item) }) } var a = [] push(a, 1, 2, 3)
PS: rest 參數后面不能再有其他參數(即只能是最后一個參數),否則會報錯。
函數的length屬性,不包括rest參數。
(function(a){}).length // 1 (function(...a) {}).length // 0 (function(a, ...b) {}).length // 1
注:函數的length屬性
指定了默認值以后,函數的length屬性,將返回沒有指定默認值的參數個數。也就是說,指定了默認值后,length屬性將失真。
(function(a){}).length // 1 (function(a = 5){}).length // 0 (function(a, b, c = 5){}).length // 2
length屬性的返回值,等於函數的參數個數減去指定了默認值的參數個數。比如,上面最后一個函數,定義了3個參數,其中有一個參數c指定了默認值,因此length屬性等於3減去1,最后得到2。這是因為length屬性的含義是,該函數預期傳入的參數個數。某個參數指定默認值以后,預期傳入的參數個數就不包括這個參數了。
推薦:http://es6.ruanyifeng.com/#docs/function
