Порядок оценки в выражении if в Javascript

Чтобы защитить мой код от доступа к необъявленным переменным, я использую

if (typeof myVar != 'undefined')

Это отлично работает, но я хотел бы использовать в нем еще один оператор if. Что-то вроде преобразования этого:

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

:

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

Учитывая, что myVar может быть undefined, этот последний код защищен в каждом случае использования и в каждом браузере?

Возможно ли, что различные утверждения внутри if () не оцениваются в том порядке, в котором они записаны?

Могу ли я предположить, что myVar == "test" будет выполняться никогда, если myVar есть undefined?

Ответ 1

Можно ли считать, что myVar == "test" никогда не будет выполняться, если myVar - undefined?

Да. Выражение, которое вы тестируете, является логическим И выражением и определяется порядок оценки двух операндов:

Производственное логическое выражениеExpression : Логическое выражениеВыражение && Побитовое выражениеВыражение оценивается следующим образом (выделено мной):

  • Пусть lref является результатом оценки LogicalANDExpression.
  • Пусть lval - GetValue (lref).
  • Если ToBoolean (lval) является ложным, возвращает lval.
  • Пусть rref является результатом оценки BitwiseORExpression.
  • Возвращает GetValue (rref).

В основном это говорит о первом операнде, если результат этой оценки false, все выражение false, а второй операнд никогда не оценивается.

Ответ 2

Да, если вы используете &&, тогда, если первое условие false, то второй никогда не будет проверяться.

Ответ 3

Да, это нормально.

В javascript приоритет выглядит следующим образом:

typeof > !=/== > &&

Для a && b b никогда не будет выполняться, если a является ложным.

Ответ 4

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

Выражение оценивается слева направо, поэтому короткое замыкание, если myVar - undefined (myVar не будет сравниваться с "тест" )

Ответ 5

Всякий раз, когда вы используете && оператор, условия, в которых вы проходите, будут оцениваться в том порядке, в котором они были переданы.

В вашем случае:

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

Когда программа входит в этот оператор if, сначала проверяет, является ли тип переменной undefined, если он возвращает true, он продолжает второй аргумент и проверяет, имеет ли значение myVar значение 'test'. Даже если myVar == 'test', оператор if будет оценивать значение false && true, который возвращает true. Только если оба условия возвращают true, блок кода будет выполнен, потому что выражение будет оценено как true (true && true).

Если первое условие

typeof myVar != 'undefined'

возвращает false, второе условие никогда не будет оценено.

Ответ 6

Очень важно! Используйте

if (myVar !== undefined)

Это означает, что myVar не пройдет, если у него было какое-либо назначение раньше.

И НЕ ИСПОЛЬЗУЙТЕ 'undefined' ЭТО ПРОСТОТА STRING!

Удачи!