2013-08-29 19 views
11

W celu ochrony mojego kodu dostępu zmiennych niezgłoszonych używamZamówienie ewaluacji w instrukcji if w JavaScript

if (typeof myVar != 'undefined') 

Działa to dobrze, ale chciałbym, aby trzymać inny if w nim. Coś jak przekształcenie to:

if (typeof myVar != 'undefined'){ 
    if (myVar == "test"){} 
} 

do tego:

if (typeof myVar != 'undefined' && myVar == "test") 

Zważywszy myVar może być zdefiniowana, to ten ostatni kod bezpieczny w każdym przypadku użycia i każdej przeglądarce?

Czy jest możliwe, że różne stwierdzenia wewnątrz if() nie są oceniane w kolejności, w jakiej zostały napisane?

Czy mogę założyć, że myVar == "test" będzie nigdy być wykonane, jeśli myVar jest niezdefiniowane?

+2

Tak, możesz. Lepszym podejściem byłoby tutaj użycie 'if (myVar && myVar ==" test ")' tutaj. – user1983983

+0

Operator tak && jest operatorem zwarcia, więc inny warunek nie będzie sprawdzany, jeśli pierwszy warunek jest fałszywy – Shadow

+0

tak, ale kod ulega awarii podczas próby uzyskania dostępu do niezdefiniowanej zmiennej – Saturnix

Odpowiedz

9

można zakładać myVar == "test" nigdy nie zostanie wykonane, jeśli myVar jest niezdefiniowany?

Tak. Wyrażenie są badania jest logical AND expression i kolejność oceny dwóch liczb jest określona:

Wytwarzanie LogicalANDExpression:LogicalANDExpression&&BitwiseORExpression ocenia się (podkreślenie) w następujący sposób:

  • Niech lref będzie wynikiem oceny LogicalANDExpression.
  • Niech lval be GetValue (lref).
  • Jeśli wartość ToBoolean (lval) jest nieprawidłowa, zwraca lval.
  • Niech rref będzie wynikiem oceny Bitwiseorexpression.
  • Zwrot GetValue (rref).

że w zasadzie mówi oceniać pierwszy argument, jeśli wynik tej oceny jest false, całe wyrażenie jest false, a drugi operand nie jest analizowany.

4

Tak, jeśli używasz & & operatora wtedy jeśli pierwszy warunek jest fałszywypotem drugi będzie nigdy testu.

1
if (typeof myVar != 'undefined' && myVar == "test") 

Wyrażenie jest oceniane od lewej do prawej, tak że będzie short circuit jeśli myVar jest undefined (myVar nie będzie porównywany do „test”)

4

Tak, jest OK.

w JavaScript, pierwszeństwo jest jak poniżej:

typeof>!=/==>&&

Dla a && b, b nigdy nie będą wykonywane, gdy a jest fałszywe.

-1

Bardzo ważne! Zastosowanie

if (myVar !== undefined) 

Oznacza to, że ma możliwości, że myVar minie gdyby miał zadanie przed.

I NIE UŻYWAĆ 'undefined' TO JEST PROSTE STRING!

Powodzenia!

+0

'var myVar = undefined' nie jest zadaniem? – Bergi

+1

Operator 'typeof' ZWRACA SIĘ PROSTY STRING! – Bergi

1

Ilekroć użyć operatora & &, warunki, które przechodzą w oceniane będą w kolejności, w jakiej zostały one przekazane w

W twoim przypadku.

if (typef myVar != 'undefined' && myVar == 'test') 

Kiedy program przechodzi ten jeśli instrukcja, najpierw sprawdza, czy typ zmiennej jest niezdefiniowany, jeśli zwraca true, to kontynuuje do drugiego argumentu i sprawdza, czy myVar ma wartość "test". Nawet jeśli myVar == "test", instrukcja if będzie oceniać wartość false & & true, która zwraca wartość true. Tylko jeśli oba warunki zwrócą true, blok kodu zostanie wykonany, ponieważ wyrażenie zostanie ocenione jako prawdziwe (true & & true).

Jeśli pierwszy warunek

typeof myVar != 'undefined' 

zwraca fałsz, drugi warunek nie będzie się oceniać.