#javascript #logic #boolean-logic #boolean-expression
#javascript #Логические #логическая логика #логическое выражение
Вопрос:
Рефакторинг некоторого старого кода, я обнаружил следующее:
someVar == !otherVar
Это выглядит не так разборчиво, я думал, что это можно записать как:
someVar != otherVar
Это кажется логичным для этого. Но, поскольку это Javascript, я боюсь побочных проблем, так что это действительно нормально?
Комментарии:
1. Каковы типы / диапазоны значений в этих переменных?
2. @Amit Обычно логическое значение, но я спрашиваю, потому что это не всегда так. Представьте, являются ли они строками или чем-то другим.
3.
someVar != otherVar
эквивалентно!(someVar == otherVar)
, все остальное зависит отotherVar
.4. @Bergi ты попал в точку. С точки зрения логики, я думаю, что могу отрицать все выражение, но не само сравнение.
5. Вы можете использовать логические значения, но не для других типов. Вам понадобится некоторое значение, для которого приведение к логическому значению и отрицание инвертирует результат всех сравнений со всеми другими значениями. Это довольно редко.
Ответ №1:
Ответ — нет.
Infinity == !NaN; // false
Infinity != NaN; // true
'abc' == !false; //false
'abc' != false; // true
Откройте консоль и проверьте ее сами. Есть еще много примеров.
Комментарии:
1. Пожалуйста, используйте фрагменты — инструктировать людей «проверять сами» — плохая практика.
2. Вот тебе и @Azamantes ! Возможно, крайний случай, но это определенно может произойти.
3. Также
{} != null
или, может[] != null
быть, или что насчетnull != false
и1 != Infinity
т. Д. Теперь как насчет объяснения?
Ответ №2:
На самом деле сами по себе операторы очень разные. !aVar
принудительно преобразует этот параметр в логическое значение. например '!0'
, = true '!1'
или любое другое число будет равно false . Некоторые другие примеры !''
= true !'abc
= false .
!=
выполняет мягкое (in) сравнение равенства, которое в зависимости от преобразований типов может иметь очень разные результаты.
например
5 != 6 //true
5 == !6 //false -> !6 is forced to a boolean (6=true,!6 = false), for the comparisson 5 is cast to a boolean (true), so the comparisson nets false
5 != 5 //false
5 == !5 //false, but because the same reason as above !5 becomes true, etc.
Вероятно, старый код, о котором вы упомянули, использует это именно по причине логизации otherVar
. Если someVar уже является логическим значением, имело бы смысл сделать это. Для всех других сравнений это, вероятно, дало бы неправильные результаты.
Комментарии:
1. Я боялся, что он выполняет какое-то приведение / логизацию переменной, и в этом случае я мог бы внести ошибку путем ее рефакторинга. Спасибо за разъяснение!