2015-06-17 13 views
6

Ti mostrerò una piccola parte della mia app in cui mi sto chiedendo quale sia il modo corretto di mettere un condizionale su cui sto lavorando. Se entrambi i modi vi mostrerò ragione, vorrei che tu mi dica le conseguenze/avversitàChiaro con una speciale istruzione condizionale

if ((some.thing === '' || 0) || (some.how === '' || 0)) { 
     //something is going on here 
} 

è così che ho finora, c'è qualcosa di brutto con esso?

o dovrebbe essere meglio così:

if ((some.thing === '' || some.thing === 0) || (some.how === '' || some.how === 0)) { 
     //something is going on here 
} 

quindi quali sono i vostri suggerimenti? è lo stesso risultato alla fine?

EDIT

Aggiunta di un altro modo:

if (some.thing === '' || some.thing === 0 || some.how === '' || some.how === 0) { 
     //something is going on here 
} 
+1

quelle 2 non sono equivalenti. –

+0

@ DanielA.White questo è quello che devo sapere, perché? – NietzscheProgrammer

+1

In entrambi i casi, fare sempre chiarezza su brevità. Anche se il primo ha funzionato, il secondo è migliore perché posso leggerlo. – Leeish

risposta

3

L'operatore ha || precedenza sugli operatori di confronto.

Quindi some.thing === '' || 0 corrisponde a (some.thing === '') || (0). It:

  • valuterà a 0 se some.thing === '' è false o
  • valuterà a true se some.thing === '' è true.

Guardate questo esempio (come in esecuzione in una console JavaScript):

> some = { thing: 0 } 
    Object { thing: 0 } 
> some.thing === '' 
    false 
> some.thing === '' || 0 // this is like false || 0 
    0 
> some = { thing: '' } 
    Object { thing: "" } 
> some.thing === '' 
    true 
> some.thing === '' || 0 // this is like true || 0 
    true 

Preferisco qualcosa come l'ultima espressione che hai scritto.

EDIT: realtà sia '' e 0 sono falsy in JavaScript, in modo da poter semplicemente scrivere l'espressione completa come:

if (!some.thing || !some.how) { 
    //something is going on here 
} 
+1

grazie, Eric :) – NietzscheProgrammer

0

|| non è come IN clausola di SQL. Fondamentalmente questo è quello che state facendo:

someBoolean || 0 

così non è mai confronta con l'uguaglianza some.thing type-safe con il Number0.

1

Questa parte sembra pesce a me:

some.thing === '' || 0 

Vuoi dire questo, invece:

some.thing === '' || some.thing === 0 

0 è sempre falsy, quindi l'espressione some.thing === '' || 0 è sempre equivalente a some.thing === ''

EDIT

è necessario l'espressione finale:

(some.thing === '' || some.thing === 0 || some.how === '' || some.how === 0) 
+0

In realtà, 'some.thing === '' || 0' sarà 'true' se' some.thing === '' ', e sarà' 0 'altrimenti. Vedi http://jsfiddle.net/8vemov1k/ –

+0

ottimo suggerimento per me, cosa ne pensi del terzo modo che ho appena aggiunto? guarda la domanda – NietzscheProgrammer

+0

@NietzscheProgrammer vedi la mia modifica –

0

Sul primo esempio, si sono fondamentalmente facendo questo:

if ((condition1 || condition2) || (condition3 || condition4)) 

Ora condition1 e la condizione 3 può essere vera o falsa, a seconda di ciò che è contenuto di some.thing e some.how, ma le condizioni 2 e 4 saranno sempre falsa (0 è falso), quindi, in pratica quello che stai dicendo è:

if (condition1 || condition3) 

tua seconda d esempio:

if (condition1 || condition2 || condition3 || condition4) 

tuo terzo esempio, sembra più simile a questo:

if ((condition1 || condition2) || (condition3 || condition4)) 

E ora tutti possono essere false o vere (per entrambe le seconde e terze esempi).

Tenete a mente, però, se per esempio some.thing è '' mentre some.how è 'qualcosa' l'intero insieme di condizioni sarà vero.

0

Utilizzare il secondo snippet di codice. Il primo frammento di codice non è valido, perché

if ((some.thing === '' || 0) || (some.how === '' || 0)) { 
     //something is going on here 
} 

pugno valutare some.thing === '' che può essere vero o falso allora restituire questo risultato o falso, in modo che il codice è finalmente

if (some.thing === '' || some.how === '') { 
     //something is going on here 
} 
Problemi correlati