Как проверить на наличие и `null`, и `undefined`?
Поскольку TypeScript является строго типизированным языком, использование конструкции if () {}
для проверки на null
и undefined
выглядит неправильно.
Существует ли в TypeScript какая-либо специализированная функция или синтаксический сахар для этой проверки?
5 ответ(ов)
Вы можете использовать "джагглинг-проверку" для того, чтобы одновременно протестировать на null
и undefined
:
if (x == null) {
Если вы используете строгую проверку, это будет истинно только для значений, установленных в null
, и не сработает для переменных, не имеющих значения (undefined):
if (x === null) {
Вы можете протестировать это с различными значениями, используя следующий пример:
var a: number;
var b: number = null;
function check(x, name) {
if (x == null) {
console.log(name + ' == null');
}
if (x === null) {
console.log(name + ' === null');
}
if (typeof x === 'undefined') {
console.log(name + ' is undefined');
}
}
check(a, 'a');
check(b, 'b');
Вывод будет таким:
"a == null"
"a is undefined"
"b == null"
"b === null"
Таким образом, вы можете видеть, как check(a, 'a')
сработает только для undefined
и null
, тогда как check(b, 'b')
сработает для обеих проверок, а также покажет, что b
строго равно null
.
В TypeScript условие if( value ) { }
будет оцениваться как true
, если value
не равен:
null
undefined
NaN
- пустой строке
''
0
false
Важно отметить, что TypeScript включает правила JavaScript, поэтому поведение этих проверок будет одинаковым в обоих языках.
TypeScript полностью поддерживает JavaScript-выражение something == null
. Это выражение корректно исключает как null
, так и undefined
при проверке.
Дополнительная информация
ПРОСТОЙ ОТВЕТ
Хотя TypeScript — это строго типизированный язык, он унаследовал те же проблемы с указателями и инициализацией переменных от JavaScript.
JavaScript не проверяет, существует ли переменная в контексте, что приводит к распространенному состоянию undefined
.
Чтобы проверить, что значение НЕ является null
, undefined
, 0
, false
, ""
или NaN
:
if (value)
или
if ( !!value )
Для отрицательного условия проверьте, является ли значение null
, undefined
, 0
, false
, ""
или NaN
:
if ( !value )
Чтобы проверить, является ли значение null
или undefined
:
if ( value == null )
Чтобы проверить только на null
:
if ( value === null )
Чтобы проверить только на undefined
:
if ( value === undefined )
ПОДРОБНЫЙ ОТВЕТ
1- Это выражение будет оцениваться как true, если значение не равно: null
, undefined
, NaN
, пустая строка ''
, 0
, false
.
Если значение равно null
, undefined
, NaN
, пустой строке
, 0
или false
, то управление перейдет к условию else.
if ( value ) {
console.log('значение отличается от 0, "", false, NaN, null, undefined');
} else {
console.log('значение равно 0, "", false, NaN, null или undefined');
}
if ( !!value ) {
console.log('значение отличается от 0, "", false, NaN, null, undefined');
} else {
console.log('значение равно 0, "", false, NaN, null или undefined');
}
2- Если вам нужно отрицательное условие, вам нужно использовать:
if ( !value ) {
console.log('значение равно 0, "", false, NaN, null или undefined');
} else {
console.log('значение отличается от 0, "", false, NaN, null, undefined');
}
3- Это выражение будет проверять, является ли значение null
или undefined
:
if ( value == null ) {
console.log('это null или undefined');
} else {
console.log('это не null и не undefined');
}
4- Использовать тест с логическими значениями не сработает.
Выражение НЕ будет оцениваться как true, так и false, если значение равно null
, undefined
, 0
, пустой строке
, или NaN
.
Обе проверки всегда перейдут в условие else.
За исключением случая, если значение является логической переменной.
if ( value==true ) {
} else {
}
if ( value==false ) {
} else {
}
Давайте разберем ваш код и результат его выполнения.
Вы провели тесты в playground TypeScript, где объявили переменные a
, b
и c
. Сначала у вас переменная a
не инициализирована, переменная b
равна null
, а переменная c
— пустая строка.
Вот что вы получили в выводе:
a is null or undefined
b is null or undefined
c is defined
На основании этого результата можно сделать несколько выводов:
Проверка
if (a == null)
— это правильный способ узнать, является лиa
равнымnull
илиundefined
. В данном случаеa
не инициализирована, и проверка возвращаетtrue
.Проверка
if (b == null)
— это также верный способ определить, является лиb
равнымnull
илиundefined
. Посколькуb
инициализирована какnull
, условие также выполнится.Проверка
if (c == null)
— это ложное срабатывание, так какc
— это пустая строка, она не равна ниnull
, ниundefined
.Проверка
if (a != null)
— корректный метод для проверки, определена ли переменнаяa
. Результат проверки будетfalse
, так какa
не инициализирована.Проверка
if (b != null)
— возвращаетfalse
, потому чтоb
равноnull
.Проверка
if (c != null)
— возвращаетtrue
, посколькуc
инициализирована как пустая строка.Проверка
if (a)
— это неверный способ проверки, существует ли переменнаяa
. Посколькуa
не инициализирована, условие не выполнится и будет проигнорировано.Проверка
if (b)
— также вернетfalse
, так какb
равнаnull
.Проверка
if (c)
— вернетtrue
, как и ожидалось, потому что пустая строка считается "правдой" в контексте либо проверки на истинность, либо проверок в логических условиях.
В итоге ваши выводы можно резюмировать следующим образом:
- Для определения, является ли переменная
null
илиundefined
, можно использовать== null
. - Для определения, что переменная определена, правильнее использовать
!= null
. - Проверка
if (a)
не подходит для этой цели, если переменная не инициализирована, поскольку возвращаетfalse
дляundefined
иnull
, но может дать неожиданные результаты для других "ложных" значений, таких как пустая строка или0
.
Это важно учитывать, когда вы разрабатываете код.
Как конвертировать строку в enum в TypeScript?
'unknown' против 'any': в чем разница?
Как получить имена элементов перечисления (enum)?
@Directive против @Component в Angular
Не удается использовать JSX, если не указан флаг '--jsx'