Сравнение 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 все равно его встроит, если он находится в горячей точке.