2016-01-17 15 views
5

Ho provato a cercare buone risorse sull'istruzione vuota, ma sembra che non compaia nulla. Anche su MDN, non hanno molto da dire al riguardo.Qual è il punto di utilizzo dell'istruzione vuota in JavaScript?

cioè:

for(var i = 0; i < a.length; a[i++] = 0); 

if((a==0) || (b == 0)); 

vorrei sapere quali sono alcuni esempi reali che si dovrebbe usare affermazioni vuote sul loro progetto. Quali sono le ragioni alla base?

+5

lasciatemi citare dal commento di codice appena sopra il ciclo for: '// Assegna tutti i valori di array a 0' – Aprillion

+0

È utile per [code golf] (http://codegolf.stackexchange.com). Ad esempio questo salva 2 byte perché non è necessario un blocco di codice racchiuso tra parentesi '{}': 'per (a = 0; a ++ <100; b = a, c = b + a);' – insertusernamehere

risposta

2

Gli esempi che hai dato non hanno molto senso. Dovrebbero essere scritti meglio

for (var i = 0; i < a.length;) a[i++] = 0; 
for (var i = 0; i < a.length; i++) a[i] = 0; 
; // the comparisons really don't do anything (assuming a and b are no objects) 
(a==0) || (b = 0); // Oh wait, that's the one given by @Shomz 
if (a != 0) b = 0; 

Tuttavia, ci sono applicazioni del mondo reale per la dichiarazione vuota. Mi limiterò a elencare 3 che mi vengono in mente:

  • function x() { 
        … 
    }; 
    

    Un punto e virgola in cui non appartiene (ad esempio, dopo la dichiarazione di funzione di cui sopra) fa una dichiarazione vuota.

  • ; 
    … 
    

    Un leading semicolon on your script files aiuta a evitare inclusioni buggy o concatenazioni di file.

  • while (!check_for_finish()); // do nothing 
    

    Un corpo del ciclo vuoto può essere utilizzato per i loop occupato-attesa (raccomandato) e simili.

2

none/pigrizia. non c'è assolutamente alcuna differenza per

for(var i = 0; i < a.length;) a[i++] = 0; 

e solo una minima differenza di

for(var i = 0; i < a.length; i++) a[i] = 0; 

il primo è a pochi ms più veloce dopo un paio di miliardi di passi di iterazione; aka. ottimizzazione prematura

EDIT:

if((a==0) || (b == 0)); 

questo non ha senso a tutti, dal momento che non fa nulla.

ma expresions come

a==0 || (b=0); 

//or maybe sth like this: 

//var noop =()=>void 0; //FYI 

typeof a === "function" || (a = noop); 

sono abbastanza utile per me, dal momento che sono brevi, e leggibili e un ulteriore se-dichiarazione non aggiunge alcun valore alla leggibilità o comprensione (almeno una volta sapete questo modello).

+3

Hai provato vero? Sono abbastanza sicuro che sia * non * più veloce. – Bergi

+0

sì, è perché in 'a [i ++] = 0' i ++ (incrementa e ottiene il valore di i) vengono elaborati come un'unica istruzione, mentre in' a [i] = 0; i ++; 'sono due; ma come ho detto, premature ottimizzazioni. Ogni funzione chiamata o funzione deottimizzata e molto altro ha un impatto maggiore sulle prestazioni rispetto a questa ottimizzazione. – Thomas

+0

Che "istruzione" intendi? Non puoi contare solo i token JS. – Bergi

1

Il primo ovviamente scorre l'array e assegna tutti i valori a zero, senza avere il codice specificato nell'istruzione.

L'altro sembra un errore di battitura, perché è inutile.

Tuttavia, qualcosa come

if((a==0) || (b = 0)); 

avrebbe senso, come sarebbe assegnare b a zero nel caso a non è zero.

var a = 1, b = 1; 
 
if((a == 0) || (b = 0)); 
 

 
alert("a: " + a + ", b: " + b);

+0

hai una strana definizione di 'make sense' -' if (a === 0) b = 0; 'o anche' b = (a === 0? 0: b) 'sono entrambi più leggibili IMO – Aprillion

+0

Ovviamente no una pratica raccomandata, né qualcosa che suggerirei né qualcosa che scriverei, ma ** una risposta alla domanda **. Ci sono incarichi in condizionali, probabilmente più di quanto ci si aspetterebbe di vedere. Venire con variazioni più leggibili sarebbe irrilevante e estenuante qui. Concentrati sulla domanda. – Shomz

+0

per favore permettimi di aggiungere un'enfasi alla domanda dell'OP: "esempi reali che uno ** dovrebbe ** usare affermazioni vuote" – Aprillion

1

Non credo che siano davvero utili, ma posso sbagliarmi. Si può provare a usare gli effetti collaterali della valutazione delle condizioni in un if, ma non vedo una buona ragione per farlo.

0

Il primo esempio è utile for(var i = 0; i < a.length; a[i++] = 0); IMO, e le ragioni sarebbero:

  • scrittura meno senza sacrificare la leggibilità.
  • bellezza!
  • Dire alla gente: Hey, sono un programmatore JS professionista. :)

Il secondo uno if((a==0) || (b == 0)); sembra non fare nulla.

0

Supponiamo di avere due funzioni X e Y e supponiamo che Y deve essere eseguito solo quando X ritorna true, in una situazione del genere si scriveranno:

if(X() && Y()); 
+1

No. Scriveresti 'if (X()) Y();' (o 'X() && Y();'). Nessuna dichiarazione vuota. – Bergi

+1

Perché non 'X() && Y()'? – Oriol

1

Il mio uso preferito perché è aspettare che una condizione diventi realtà.

while (!condition); 
// do what happens once your condition is met 

Questo è bello leggere, a mio parere, ma lo stesso può essere fatto con { } anziché l'istruzione vuota.