Что общего у числа 0, пустой строки, неопределенного и нулевого значений? Я бы сказал, ничего особенного.
В большинстве кодовых баз вы увидите следующие утверждения:
if (this.age) { this.postUpdate(age); }
И почему бы нет. Они хорошо смотрятся и даже поощряют сексуальные однострочники:
if (!this.age) return;
Эти проверки являются плодородной почвой для любых ошибок. Прочтите почему.
Начнем с основ
Чтобы понять, почему приведенные выше утверждения обычно не подходят, нам нужно понять результаты приведенных ниже выражений.
Я предполагаю, что в большинстве случаев использования вы действительно хотите проверить переменную по значениям null и undefined, а не по пустой строке или числу 0.
if (!this.variable) { // matches: "", 0, undefined, null } if (this.variable == null) { // matches undefined, null }
Я понял
if (variable == null)
выглядит не так сексуально, но поверьте мне, как только вы начнете применять его по умолчанию, пути назад уже не будет.
Я собрал несколько примеров, которые вызывают неожиданное поведение или являются просто ошибками.
Пример 1
Эта функция возвращает результат функции вызова trueFn, если выражение определено.
Проблема
Передача пустой строки «» или числа 0 приведет к вызову falseFn . Вы можете себе представить, что передача 0 или «» может быть очень распространенным вариантом использования в этом сценарии.
Не удается
// age=0 should be a valid option when(age, () => 'Her age is:', () => 'Loading'); // if bio is an empty string, then the input should be empty as well when(bio, () => bio, () => 'Loading');
Решение
Пример 2
Это обратный вызов прослушивателя событий, который вызывается всякий раз, когда значение ввода изменяется. В намерения разработчика не входило исключение 0 и пустых значений.
Не удается
// Both were allowed values _valueChanged(0) _valueChanged("")
Решение
Пример №
Раз в два месяца я нахожу ошибки, связанные с обычным способом проверки переменных. Я буду добавлять их, если позволит время.
Во все большем числе популярных библиотек JavaScript вы увидите в их кодовой базе проверки двойного равенства нулю. Подчеркивание, Меньше и даже JQuery применяют этот принцип. Линтеры позволяют использовать нестрогие проверки равенства, когда дело доходит до null.
См. Также лучшие практики AirBnB https://github.com/airbnb/javascript/blob/57ff032b0740ba2a46af4bc40cf5638a3e62a365/packages/eslint-config-airbnices/best-base/pru/ .js # L40
Еще одним вариантом выполнения этих проверок может быть строгая проверка типов. Однако я считаю, что по крайней мере в 80% случаев мы пишем этот код бессознательно и не думаем обо всех возможных сценариях. Если ваш способ проверки по умолчанию на соответствие определенным значениям - ==null
, то в большинстве случаев все будет в порядке.
См. Также https://adripofjavascript.com/blog/drips/equals-equals-null-in-javascript.html