2015-06-17 6 views
6

Pokażę Wam małą część mojej aplikacji, w której zastanawiam się, jaki jest właściwy sposób na postawienie warunkowego, nad którym pracuję. Jeśli obie strony pokażę masz rację, chciałbym Ci powiedzieć mi konsekwencje/przeciwnościWyjaśnienie za pomocą specjalnego warunkowego oświadczenia

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

to jak mam go do tej pory, jest tam coś złego się z nim?

lub powinno być lepiej w ten sposób:

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

więc jakie są wasze sugestie? czy to jest ten sam rezultat na końcu?

EDIT

Dodawanie inny sposób:

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

tych 2 nie są równoważne. –

+0

@ DanielA.White to jest to, co muszę wiedzieć, dlaczego? – NietzscheProgrammer

+1

W obu przypadkach należy zawsze zachować jasność nad zwięzłością. Nawet jeśli pierwsza zadziałała, druga jest lepsza, bo mogę ją przeczytać. – Leeish

Odpowiedz

3

Operator ma || pierwszeństwo przed operatorami porównania.

Tak some.thing === '' || 0 jest taki sam jak (some.thing === '') || (0). Jest:

  • oceni do 0 jeśli some.thing === '' jest false lub
  • oceni do true jeśli some.thing === '' jest true.

Spójrz na ten przykład (jak działa w konsoli 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 

Wolę coś takiego ostatniej wypowiedzi napisałeś.

EDIT: Właściwie zarówno '' i 0falsy w JavaScript, więc można po prostu napisać swój pełny wyraz jak:

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

dziękuję, Eric :) – NietzscheProgrammer

0

|| nie jest jak zapytania SQL za IN klauzuli. Zasadniczo jest to, co robisz:

someBoolean || 0 

więc nigdy nie porównuje some.thing z typu bezpieczny równości z Number0.

1

Ta część wygląda podejrzanie mi:

some.thing === '' || 0 

Czy oznacza to zamiast:

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

0 jest zawsze falsy, więc wyrażenie some.thing === '' || 0 zawsze jest równoznaczne z some.thing === ''

EDYCJA

Trzeba ostateczny wyraz:

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

Właściwie, 'some.thing === '' || 0' będzie "true", jeśli 'some.thing === ''', a inaczej będzie "0". Zobacz http://jsfiddle.net/8vemov1k/ –

+0

wspaniałą wskazówkę dla mnie, co sądzisz o trzeciej drodze, którą właśnie dodam? spójrz na pytanie – NietzscheProgrammer

+0

@NietzscheProgrammer zobacz moją edycję –

0

Na pierwszym przykładzie, to w zasadzie to robi:

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

Teraz condition1 i stan 3 mogą być prawdziwe lub fałszywe, w zależności od tego, co znajduje się treść z some.thing i some.how, ale warunków 2 i 4 będą zawsze false (0 jest fałszywe), więc w zasadzie to, co mówią jest:

if (condition1 || condition3) 

Twój secon d przykład:

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

Twój trzeci przykład, wygląda bardziej jak to:

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

A teraz wszystkie z nich mogą być fałszywe lub prawdziwe (zarówno dla drugiego i trzeciego przykładach).

Należy jednak pamiętać, że na przykład, gdy coś jest "", podczas gdy "jakoś" jest "czymś", cały zestaw warunków będzie prawdziwy.

0

Użyj drugiego fragmentu kodu. Pierwszy fragment kodu nie jest ważny, ponieważ

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

pięść ocenić some.thing === '' które mogą być prawdziwe fałszywe następnie powrót ten wynik lub fałszywe, więc kod jest wreszcie

if (some.thing === '' || some.how === '') { 
     //something is going on here 
} 
Powiązane problemy