ES2015のspread構文とrestパラメーターについて混乱しています。誰かがそれらの違いを適切な例で説明できますか?
スプレッドを使用する場合、単一の変数をさらに拡張します:
var abc = ['a', 'b', 'c'];
var def = ['d', 'e', 'f'];
var alpha = [ ...abc, ...def ];
console.log(alpha)// alpha == ['a', 'b', 'c', 'd', 'e', 'f'];
残余引数を使用する場合、関数の残りのすべての引数を1つの配列にまとめます:
function sum( first, ...others ) {
for ( var i = 0; i < others.length; i++ )
first += others[i];
return first;
}
console.log(sum(1,2,3,4))// sum(1, 2, 3, 4) == 10;
ES6には、新しい機能3つのドット...
これらのドットの使用方法は次のとおりです。
休息/収集家/収集として
var [c, ...m] = [1,2,3,4,5]; // m -> [2,3,4,5]
ここに ...m
はコレクターであり、残りのパラメーターを収集します。内部的に私たちが書くとき:
var [c, ...m] = [1,2,3,4,5];
JavaScriptは以下を行います
var c = 1,
m = [2, 3, 4, 5];
スプレッドとして
var params = [ "hello", true, 7 ];
var other = [ 1, 2, ...params ]; // other => [1,2,"hello", true, 7]
ここに、 ...params
は、そのすべての要素をother
に割り当てるように広がります。
内部的にjavaScriptは以下を行います
var other = [1, 2].concat(params);
お役に立てれば。
JavaScriptでは...
は過負荷です。演算子が使用される場所に基づいて、異なる操作を実行します。
レストパラメーターの構文:
function rest(first, second, ...remainder) {
console.log(remainder);
}
// 3, 4 ,5 are the remaining parameters and will be
// merged together in to an array called remainder
rest(1, 2, 3, 4, 5);
スプレッド構文:
function sum(x, y, z) {
return x + y + z;
}
const numbers = [1, 2, 3];
// the numbers array will be spread over the
// x y z parameters in the sum function
console.log(sum(...numbers));
// the numbers array is spread out in the array literal
// before the elements 4 and 5 are added
const newNumbers = [...numbers, 4, 5];
console.log(newNumbers);
コードに「...」が表示されている場合は、残りのパラメーターまたはスプレッド演算子です。
それらを区別する簡単な方法があります:
...が関数パラメーターの最後にある場合、それは「残りのパラメーター」であり、リストの残りを配列に収集します。関数呼び出しなどで...が発生した場合、「スプレッド演算子」と呼ばれ、配列をリストに展開します。パターンを使用する:
残りのパラメーターは、任意の数の引数を受け入れる関数を作成するために使用されます。 spread演算子は、多くの引数のリストを通常必要とする関数に配列を渡すために使用されます。これらを組み合わせることで、リストとパラメーターの配列間を簡単に移動できます。詳細については ここをクリック
ES6に追加されたこれら3つのドット_...
_には、Spread演算子とRestパラメーターの2つの意味があります
スプレッド演算子:3つのドットを使用して、iterables
をiterables
で展開します。つまり、arrays
、string
などを引数として使用します。たとえば、Math.max()
関数は不定の数の引数を想定しているため、Spread演算子を使用して、Math.max()
関数の引数として要素を展開できます。 mdn の例
_console.log(Math.max(1, 3, 2));
// expected output: 3
console.log(Math.max(-1, -3, -2));
// expected output: -1
var array1 = [1, 3, 2];
console.log(Math.max(...array1));
// expected output: 3
_
別のユースケースは、たとえばこの配列を追加することです
_const videoGames = ['mario galaxy', 'zelda wind waker', 'ico'];
_
別の配列に追加できます
_const favoritesVideoGames = ['Shadow of the colosus', ...videoGames];
_
favoritesVideoGames
値は
_[ 'Shadow of the colosus', 'mario galaxy', 'zelda wind waker', 'ico' ]
_
Restパラメーターについて、ここでは [〜#〜] mdn [〜#〜] 定義
残りのパラメーター構文により、不特定数の引数を配列として表すことができます。
これは、多くの要素を単一の要素にパックできることを意味します
ここでMDNからの例
_function sum(...theArgs) {
return theArgs.reduce((previous, current) => {
return previous + current;
});
}
console.log(sum(1, 2, 3));
// expected output: 6
console.log(sum(1, 2, 3, 4));
// expected output: 10
_
私は通常、これらの3つのポイントと混同されます。この イラスト by @ stephaniecodes は、その論理を思い出すのに役立ちます。この質問に答えるためにこのイラストからインスピレーションを得たと言います。
役に立つことを願っています。
基本的にPythonのように:
>>> def func(first, *others):
... return [first, *others]
>>> func('a', 'b', 'c')
['a', 'b', 'c']
Javascriptのつのドット(...
)operatorは、2つの異なる方法で使用できます。
var days = ["Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri"];
const [sat, Sun, ...weekdays] = days;
console.log(sat); // "Sat"
console.log(Sun); // "Sun"
console.log(weekdays); // ["Mon", "Tue", "Wed", "Thu", "Fri"]
var weekdays = ["Mon", "Tue", "Wed", "Thu", "Fri"];
var days = [...weekdays, "Sat", "Sun"];
console.log(days) // ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
スプレッド演算子は最初の要素にできますが、残りの要素を収集するには、残りのパラメーターが最後のである必要があることに注意してください。