1. ホーム
  2. javascript

[解決済み] JavaScriptで "arguments "オブジェクトを配列に変換するにはどうすればよいですか?

2022-03-22 22:04:18

質問内容

arguments JavaScript のオブジェクトは奇妙なもので、ほとんどの状況で配列のように振る舞いますが、それは 実際に 配列オブジェクトです。これは 本当に全く別のもの の便利な機能は持っていません。 Array.prototype のように forEach , sort , filter および map .

引数オブジェクトから新しい配列を作るのは、単純なforループを使えば些細なことです。例えば、この関数は引数をソートします。

function sortArgs() {
    var args = [];
    for (var i = 0; i < arguments.length; i++)
        args[i] = arguments[i];
    return args.sort();
}

しかし、これは単に非常に便利なJavaScriptの配列関数にアクセスするために行わなければならない、かなり哀れなことです。標準ライブラリを使ってこれを行うビルトインの方法はないのでしょうか?

解決方法は?

レストパラメータを使用したES6

ES6を使用できる方は使用できます。

レストパラメータ

function sortArgs(...args) {
  return args.sort(function (a, b) { return a - b; });
}

document.body.innerHTML = sortArgs(12, 4, 6, 8).toString();

にあるように リンク

<ブロッククオート

restパラメータ構文では、不特定多数の引数を配列として表現することができます。

が気になる方は ... という構文があり、これは スプレッド演算子 をご覧ください。 こちら .

Array.from()を使ったES6

使用方法 Array.from :

function sortArgs() {
  return Array.from(arguments).sort(function (a, b) { return a - b; });
}

document.body.innerHTML = sortArgs(12, 4, 6, 8).toString();

Array.from Array-like または Iterable オブジェクトを Array インスタンスに単純に変換します。



ES5

を使用することができます。 Array 's slice 関数で引数オブジェクトを指定すると、それを標準的なJavaScriptの配列に変換してくれます。Arrayのプロトタイプを使って手動で参照する必要があるだけです。

function sortArgs() {
    var args = Array.prototype.slice.call(arguments);
    return args.sort();
}

なぜこれが有効なのか?さて、以下はその抜粋です。 ECMAScript 5 のドキュメントそのもの :

ノート : は slice 関数は意図的に一般的なものです。 これ の値はArrayオブジェクトでなければなりません。したがって、他の種類のオブジェクトに転送して、メソッドとして使用することができます。の有無は slice 関数をホストオブジェクトにうまく適用できるかどうかは、実装に依存する。

そのため slice があるものはすべて動作します。 length プロパティがあり、その arguments が便利です。


もし Array.prototype.slice は口数が多いので、配列リテラルを使って少し省略することができます。

var args = [].slice.call(arguments);

しかし、私は前者の方がより明示的だと感じることが多いので、代わりに前者を選びます。配列リテラル表記を乱用すると、ハチャメチャな感じがするし、見た目も変だ。