Operatore diffusore vs Rest in ES2015 / es6

Sono confuso circa l' spread operator in rest parameter in ES2015. Qualcuno può spiegare la differenza tra di loro con un esempio appropriato?

Quando si utilizza la diffusione, si espande una singola variabile in più:

 var abc = ['a', 'b', 'c']; var def = ['d', 'e', 'f']; var alpha = [ ...abc, ...def ]; // alpha == ['a', 'b', 'c', 'd', 'e', 'f']; 

Quando si utilizzano argomenti di rest, si colpiscono tutti gli argomenti restanti di una function in un arrays:

 function sum( first, ...others ) { for ( var i = 0; i < others.length; i++ ) first += others[i]; return first; } // sum(1, 2, 3, 4) == 10; 

ES6 ha una nuova caratteristica di tre punti ...

Ecco come possiamo usare questi puntini:

Come Riposo / Raccoglitore / Raccogliere

 var [c, ...m] = [1,2,3,4,5]; // m -> [2,3,4,5] 

Qui ...m è un collezionista, raccoglie il resto dei parametri. Internamente quando scriviamo:

var [c, ...m] = [1,2,3,4,5]; JavaScript segue

 var c = 1, m = [2, 3, 4, 5]; 

Come diffondere

 var params = [ "hello", true, 7 ]; var other = [ 1, 2, ...params ]; // other => [1,2,"hello", true, 7] 

Qui, ...params diffondono in modo da assoggettare tutti i suoi elementi ad other

Internamente javaScript segue

 var other = [1, 2].concat(params); 

Spero che questo ti aiuti.

Fondamentalmente come in Python:

 >>> def func(first, *others): ... return [first, *others] >>> func('a', 'b', 'c') ['a', 'b', 'c']