Этот JavaScript:
a.foo != null
фактически проверяет, является ли свойство foo
a
ни undefined
, ни null
. Обратите внимание, что a.foo?
переведено на JavaScript, который использует != null
вместо !== null
. Преобразования, которые !=
делает, означают, что оба они истинны:
null == null
undefined == null
Простой a?
становится таким JavaScript:
typeof a !== "undefined" && a !== null
потому что есть три условия для проверки:
- Есть ли где-нибудь область действия
a
? 1023 *
- Имеет ли
a
значение undefined
?
- Имеет ли
a
значение null
?
Первое условие важно, поскольку просто сказать, что a != null
вызовет ReferenceError, если в области действия нет a
, а сказать, что typeof a === 'undefined'
не будет. Проверка typeof
также учитывает условие a === undefined
в 2 . Затем мы можем завершить его строгим тестом a !== null
, поскольку он учитывает 3 без потери производительности из-за ненужных !=
(примечание: !=
и ==
медленнее, чем !==
и ===
из-за неявных преобразований).
Небольшое чтение о том, что !=
и !==
делают, может быть плодотворным:
MDN: операторы сравнения
Что касается вашего комментария к удаленному ответу, if(a.foo)
- это совершенно правильный синтаксис , если , вы завершите оператор if
:
if(a.foo)
do_interesting_things()
# or
do_interesting_things() if(a.foo)
Однако if(a.foo)
и if(a.foo?)
отличаются тем, как они обрабатывают 0
, false
и ''
.