Что общего у числа 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