È buona pratica usare l'assegnazione di array.pop () in una condizione di ciclo?

5

Ho appena visto uno snippet di codice che utilizzava un'assegnazione pop array in condizioni while; mi chiedevo se questo è accettabile / buone pratiche?

var arr = [0,1,2,3,4,5];
var current;
while (current = arr.pop())
{
  // do stuff to each element stored in current
}
    
posta flewk 09.09.2016 - 01:17
fonte

2 risposte

4

È non necessariamente sbagliato se il codice fa ciò che deve fare, tuttavia, decisioni come questa possono essere una questione di gusto o opinione in una scrittura personale codice. Viceversa, evitare questa particolare disposizione della logica può essere un requisito di un datore di lavoro.

Ecco le cose da considerare.

  1. Hai capito cosa sta facendo il codice?
  2. Qualcun altro si aspetta che legga il codice e capisca cosa sta facendo, e sarà relativamente facile per loro leggere e capire che cosa sta facendo il codice?
  3. Il codice verrà utilizzato come parte del codice di sviluppo di un progetto per un gruppo o un'organizzazione che implementa lo Stile di programmazione linee guida?

Modifica

Per essere più specifici, ecco alcuni pro e contro usando il codice nel tuo esempio.

Pro

  • In casi d'uso specifici, come un array che è garantito per contenere oggetti o altri valori "veri", questo modo è conciso, raddoppiando come un'istruzione condizionale e un'istruzione di assegnazione.

Contro

  • Se la matrice contiene undefined , null , 0 , false , NaN , "" o ha "buchi", in questo modo avrà esito negativo.

"Fori" indica quando la matrice ha una lunghezza maggiore di 0 e ad alcuni (o tutti) gli elementi dell'array non è stato assegnato un valore.

"Verità" significa valori che non valutano in falso (vedere i contro). Non dimenticare NaN o "" , l'ho quasi fatto.

Il codice nel tuo esempio contiene già un bug. Il primo elemento dell'array sarà perso. Perché? Il primo elemento è zero, che quando usato in un'istruzione di assegnazione restituisce il valore zero, che viene trattato come falso dal ciclo while, vale a dire che il ciclo while si arresta prima di elaborare l'ultimo elemento sullo "stack", o piuttosto il primo elemento nell'array.

    
risposta data 09.09.2016 - 07:13
fonte
3

Se l'intenzione è di elaborare l'array come una coda o una pila, in cui gli elementi vengono rimossi mentre vengono elaborati, sì. Questo è un approccio abbastanza standard.

In effetti, a volte vedi questo tipo di loop per attraversamenti di alberi in cui lo stack overflow, o la necessità di mettere in pausa e riprendere, sono un potenziale problema nella soluzione ricorsiva.

    
risposta data 09.09.2016 - 01:58
fonte

Leggi altre domande sui tag