1

わかりましたので、新しいスプレッドが関数パラメーターとしてどのように機能するかを理解しようとしています。パラメーターの数が不明な関数を想像して、それらをすべて一緒に追加します。

let addNums = ...a => a.reduce ((a,b) => a+b);

この機能は明らかに機能します。それで、私の問題は何ですか?さて、ここにいくつかの観察があり、その後に私の問題があります:

  1. 関数のパラメーター/引数としての拡散構文は、値の配列を個別の引数として「拡散」するように設計されているようです。

私が行った調査に基づいて、スプレッド構文を使用して、標準として配列を引数として受け入れない関数に配列を渡すことができます。たとえば、Array.prototype.push() を使用する必要はありませんapply

var x = [];
var y = [1,2,3];
// where Array.push(arg1,arg2,...) requires separate arguments this is now possible:
x.push(...y);
// which 'spreads' 'y' into separate arguments: x.push (arg1,arg2,...)

ただし、この場合に渡される配列は、push事前に宣言/定義する必要があります (この場合y)

  1. これは、関数内の引数オブ​​ジェクトの長さを調べることで確認されます

私が使用するaddNums(1,2,3,4)と、arguments.lengthまだ== 4です。そのため、関数もまだ呼び出されているようですaddNums(1,2,3,4)

問題

私の問題はaddNums、スプレッド構文を処理するための引数として配列を呼び出していないことです。私は呼び出していません私addNums([1,2,3,...])が理解するのに苦労している動作は、単一の引数としてスプレッド構文で宣言された関数が与えられた場合、秘密の隠されたステップがあるように見えるということです:

let x =  ...someSetOfValues => return something ;

次に、引数のリストを指定して呼び出します。

x(1,2,3,4,...);

argumentsオブジェクトの生成がありますANDArray型の変数、関数パラメーターと同じ名前で、スプレッド構文で作成されます。

おそらくこれは、より経験豊富なコーダーにとって明白または些細なことですが、未知の長さのパラメーターのセットに値の配列を分散させるなど、これまでに提案されたユースケースには直感に反するように思えます。

実際、関数が複数のパラメーターで呼び出され、スプレッド構文で単一のパラメーターで定義されている場合、パラメーター間で配列を読み取って分割するのではなく、スプレッド構文は実際には次のように機能します。 :Array.apply(null, arguments)またはvar a = [arg1, arg2, ...]- ** スプレッダーではなく作成者です **

私の研究の情報源:

特に、質問に対するコメント「@void 主に関数呼び出しで使用されます。つまり、myFunc が不明な数の引数を取る場合、スプレッドのある配列として引数を与えることができます。このように: myFunc(...dynamicallyGeneratedArgs)」

4

1 に答える 1

0

さらに調査を行った結果、レストパラメーターと呼ばれるものへの参照を見つけることができました。

残りのパラメーター...は、パラメーターの一部としてスプレッド構文を使用しているように見えますが、動作が異なります。実際、それらは不特定の数の引数/パラメーターを収集し、それらを関数内の配列として使用できるようにします。

出典: 「rest」パラメーターの MDN 説明へのリンク

基本的に、私が最初に観察した動作です!

于 2016-06-09T06:38:04.017 に答える