Порядок оценки в выражении 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!
Удачи!