Сравнение Javascript == нулевые альтернативы

В коде JavaScript я хочу заменить структуру двойного равенства следующего оператора if:

if( name == null ) {
  //do stuff
}

Двойное равенство не выполняется для правила jshint "eqeqeq", где рекомендуется заменять двойное равенство на тройное. На мгновение представим, что приведенный выше код изменился с == null в === null как это:

if( name === null ) {
  //do stuff
}

Это будет работать для переменной, явно определенной, имеющей значение null, но, к сожалению, потерпит неудачу для любых неустановленных переменных, подобных этой

var a = null; // works correctly
var b;        // will fail in comparison

Ранее, когда для меня было важно правило тройного равенства, я делала следующее

if( name === null ||| typeof(name) === 'undefined' )

но я нахожу это чрезвычайно раздутым.

Лучшая альтернатива, которую я могу придумать сейчас, это использовать природу оператора if и позволить ему вычислять выражение false-ish, как здесь, где я отрицаю выражение и просто удаляю == null часть:

if( !name ) {
  //do stuff
}

Для меня это намного проще, легко читается и полностью избегает явного сравнения с равными. Тем не менее, я не уверен, есть ли какие-либо крайние причины, которые я пропускаю здесь?

Вопрос в том, могу ли я вообще заменить == null с отрицанным выражением if? Если так, то каковы подводные камни и исключения, где это не сработает? Работает ли это для общих элементов массива, строк, свойств объекта?

Мои критерии выбора решения будут

  • чистый код
  • легко читать и быстро понять
  • проверяет правила jshint
  • работает в современных браузерах (по состоянию на январь 2015 г.)

Мне известны другие слегка связанные вопросы для обсуждения различий в операторах равенства == против ===, но это просто для обсуждения оценки по сравнению с нулевым значением внутри оператора if.

1 ответ

Итак, вопрос в том, могу ли я вообще заменить == null на выражение с отрицанием if?

Вероятно, не универсально, нет, но, возможно, в некоторых местах.

Если так, то каковы подводные камни и исключения, где это не сработает? Работает ли это для общих элементов массива, строк, свойств объекта?

!value проверка будет верна для всех значений Falsey, а не только null а также undefined, Полный список: null, undefined, 0, "", NaN и, конечно же, false,

Так что если у вас есть name = "" затем

if (!name) {
    // ...
}

... оцените истину и зайдите в блок, где ваш предыдущий

if (name == null) {
    // ...
}

... не будет. Так что, если вы будете делать это везде, это может привести к проблемам.

Но для ситуаций, когда вы знаете, что вы хотите перейти на любое значение фальси, !value вещь очень удобная Например, если переменная должна быть undefined (или же null) или ссылку на объект, я буду использовать if (!obj) чтобы проверить это, потому что любая ценность фальши достаточно хороша для меня.

Если вы хотите продолжать использовать JSHint's === Правило, вы можете дать себе полезную функцию:

function isNullish(value) {
    return value === null || typeof value === "undefined";
}

Затраты на вызов функции не о чем беспокоиться ( больше), и любой приличный движок JavaScript все равно его встроит, если он находится в горячей точке.

Другие вопросы по тегам