--- title: 残余引数 slug: Web/JavaScript/Reference/Functions/rest_parameters tags: - Functions - JavaScript - Language feature - Rest - Rest parameters - 残余引数 - 言語機能 - 関数 translation_of: Web/JavaScript/Reference/Functions/rest_parameters ---
残余引数構文により、不定数の引数を配列として表すことができます。
このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、https://github.com/mdn/interactive-examples をクローンしてプルリクエストを送信してください。
function f(a, b, ...theArgs) {
// ...
}
関数の最後の引数に ... の接頭辞を付けると、(ユーザーが提供した) その位置にある残りの引数を JavaScript の「標準の」配列の中に入れることができます。
最後の引数のみが「残余引数」になることができます。
function myFun(a, b, ...manyMoreArgs) {
console.log("a", a)
console.log("b", b)
console.log("manyMoreArgs", manyMoreArgs)
}
myFun("one", "two", "three", "four", "five", "six")
// コンソール出力:
// a, one
// b, two
// manyMoreArgs, [three, four, five, six]
arguments オブジェクトとの違い残余引数と {{jsxref("Functions/arguments", "arguments")}} オブジェクトの間には、主に 3 つの違いがあります。
arguments オブジェクトは、関数に渡されるすべての引数を含みます。arguments オブジェクトは実配列ではありません。一方、残余引数は {{jsxref("Global_Objects/Array", "Array")}} インスタンスです。これは、{{jsxref("Array.sort", "sort")}}, {{jsxref("Array.map", "map")}}, {{jsxref("Array.forEach", "forEach")}}, {{jsxref("Array/pop", "pop")}} などのメソッドを直接適用できることを意味します。arguments オブジェクトは、(callee プロパティのように) 自身への固有の追加機能を持っています。残余引数は、引数により引き起こされる定型コードを減らすために導入されました。
// 残余引数の登場以前は、"arguments" を普通の配列に変換するには以下のようにしていました。
function f(a, b) {
let normalArray = Array.prototype.slice.call(arguments)
// -- or --
let normalArray = [].slice.call(arguments)
// -- or --
let normalArray = Array.from(arguments)
let first = normalArray.shift() // OK、最初の引数が得られる
let first = arguments.shift() // エラー (arguments は通常の配列ではない)
}
// 残余引数を使ってふつうの配列へのアクセスが得られるようになりました
function f(...args) {
let normalArray = args
let first = normalArray.shift() // OK、最初の引数が得られる
}
この例では、最初の引数が a に、2番目の引数が b に割り当てられますので、これらの名前付き引数はふつう通り使われます。
しかし、3番目の引数、manyMoreArgs は、3番目、4番目、5番目、6番目、・・・n番目 — ユーザーが入れただけの数の引数を持つ配列になります。
function myFun(a, b, ...manyMoreArgs) {
console.log("a", a)
console.log("b", b)
console.log("manyMoreArgs", manyMoreArgs)
}
myFun("one", "two", "three", "four", "five", "six")
// a, one
// b, two
// manyMoreArgs, [three, four, five, six]
以下の例では・・・値が 1 つしかなくても、最後の引数は配列に入れられます。
// 上記の例と同じ関数定義を使用
myFun("one", "two", "three")
// a, one
// b, two
// manyMoreArgs, [three]
以下の例では、3番目の引数が提供されていませんが、manyMoreArgs は配列のままです (ただし空のものです)。
// 上記の例と同じ関数定義を使用
myFun("one", "two")
// a, one
// b, two
// manyMoreArgs, []
theArgs は配列なので、length プロパティを使用して要素数を取得することができます。
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(element => {
return multiplier * element
})
}
let arr = multiply(2, 1, 2, 3)
console.log(arr) // [2, 4, 6]
Array のメソッドを残余引数で利用することができますが、arguments オブジェクトでは利用できません。
function sortRestArgs(...theArgs) {
let sortedArgs = theArgs.sort()
return sortedArgs
}
console.log(sortRestArgs(5, 3, 7, 1)) // 1, 3, 5, 7
function sortArguments() {
let sortedArgs = arguments.sort()
return sortedArgs // これは実行されない
}
console.log(sortArguments(5, 3, 7, 1))
// TypeError が発生 (arguments.sort は関数ではない)
arguments オブジェクト上で Array メソッドを使用するには、まずオブジェクトを実配列に変換する必要があります。
function sortArguments() {
let args = Array.from(arguments)
let sortedArgs = args.sort()
return sortedArgs
}
console.log(sortArguments(5, 3, 7, 1)) // 1, 3, 5, 7
| 仕様書 |
|---|
| {{SpecName('ESDraft', '#sec-function-definitions', 'Function Definitions')}} |
{{Compat("javascript.functions.rest_parameters")}}