В Javascript A == !B всегда совпадает с A != B

#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. Я боялся, что он выполняет какое-то приведение / логизацию переменной, и в этом случае я мог бы внести ошибку путем ее рефакторинга. Спасибо за разъяснение!