2016-01-01 32 views
17

Si consideri il seguente codice di esempioDiffusione Sintassi ES6

var x = ["a", "b", "c"]; 
var z = ["p", "q"]; 

var d = [...x, ...z]; 

var e = x.concat(z); 

Qui, il valore di d e e sono esattamente lo stesso ed è pari a ["a", "b", "c", "p", "q"], quindi,

  1. Qual è esattamente la differenza tra questi Due?
  2. Quale è più efficiente e perché?
  3. Qual è esattamente l'uso della sintassi di diffusione?

Non pensate che l'introduzione di queste piccole scorciatoie in un linguaggio formale ampio possa lasciare alcuni bug inosservati, voglio dire che è abbastanza inutile o non mi rendo conto che sia necessario.

+0

Mentre le risposte a questo: "Non pensi che l'introduzione di queste piccole scorciatoie in un linguaggio formale ampio possa lasciare alcuni bug inosservati" sarà basata sulle opinioni, la mia opinione è che, sì, la maggioranza di ES6 è andando a generare una pletora di codice buggy perché gli sviluppatori sciatti e/o junior non capiranno esattamente quello che stanno facendo. – rockerest

+0

È ora di testare la velocità! – towerofnix

+0

@rockerest esattamente questo è quello che stavo pensando. – void

risposta

11
  1. Nel tuo esempio proposta, non v'è sostanzialmente alcuna differenza tra i due
  2. .concat è significantly more efficient: http://jsperf.com/spread-into-array-vs-concat perché ... (spread) è lo zucchero soltanto sintassi in cima sintassi sottostante più fondamentale che esplicitamente itera indici per espandere l'array .
  3. Diffusione permette zuccherato sintassi in cima più goffo la gestione di array diretta

di espandere sopra 3 #, l'uso di diffusione è un esempio un po 'artificiosa (anche se quello che probabilmente apparirà in natura frequentemente). La diffusione è utile quando, ad esempio, l'intera lista di argomenti deve essere passata a .call nel corpo della funzione.

function myFunc(){ 
    otherFunc.call(myObj, ...args); 
} 

contro

function myFunc(){ 
    otherFunc.call(myObj, args[0], args[1], args[2], args[3], args[4]); 
} 

Questo è un altro esempio arbitraria, ma è un po 'più chiaro il motivo per cui l'operatore diffusione sarà piacevole da usare in alcune situazioni altrimenti verbose e goffo.

Come @loganfsmythpoints out:

Diffusione funziona anche su oggetti iterabili arbitrari che significa che non funziona solo su Array s ma anche Map e Set tra gli altri.

Questo è un grande punto e aggiunge all'idea che - sebbene non impossibile da ottenere in ES5 - la funzionalità introdotta nell'operatore di diffusione è uno degli elementi più utili nella nuova sintassi.


Per la sintassi sottostante effettivo per l'operatore diffusione in questo particolare contesto (dal ... può anche essere un "riposo" parametro), vedi the specification. "sintassi di base più fondamentale che itera esplicitamente sugli indici per espandere l'array" come ho scritto sopra è sufficiente per ottenere il punto, ma la definizione effettiva utilizza GetValue e GetIterator per la variabile che segue.

+0

campione reale per l'utilizzo: '$ .when' che non consente l'array di promesse come parametro, quindi' $ .when (... args) 'è bello :) – Grundy

+2

Spread funziona anche su oggetti iterabili arbitrari, il che significa che non funziona solo su 'Array's ma anche' Map' e 'Set' tra gli altri. – loganfsmyth