Первый,
if(value != 'foo') {}
не только более удобочитаемый, но и единственный, который работает так, как вы ожидаете.
Это означает, что "значение не равно 'foo'".
Ваш второй,
if(!value == 'foo') {}
означает "равна ли инвертированная истинность значения 'foo'"
(он преобразует value
в логическое значение и берет его отрицательную версию)
Если, однако, вы хотели сказать
if (!(value == 'foo'))
для второго, то ответ все тот же, что лучше: первый.
Нет причин расширять оператор, делая его еще более запутанным, когда !=
уже существует.
Посмотрите на эту демонстрацию:
const value1 = "foo";
const value2 = "bar";
console.log("expected", false, true);
console.log("first option", value1 != 'foo', value2 != 'foo');
console.log("second option", !value1 == 'foo', !value2 == 'foo');
console.log("modifed second option", !(value1 == 'foo'), !(value2 == 'foo'));
тест |
"фу" |
"бар" |
ожидаемый |
ложь |
истина |
первый вариант |
ложь |
истина |
второй вариант |
ложь |
ложь |
модифицированный второй вариант |
ложь |
истина |
Как видите, указанный вами второй вариант всегда будет приводить к false
, потому что он проверяет, равен ли true
(если значение является пустой строкой) или false
(если значение является непустой строкой) строковый литерал foo
Они семантически различны. Второй всегда будет
false
, потому что!value
всегда является логическим значением, поэтому не будет равноfoo
. Вы наверное хотели написатьif (!(value == 'foo')
if(value != 'foo') {}
совпадает сif(!(value == 'foo')) {}
. Первый просто читабельнее и предпочтительнее в 99% случаев. Ваш второй пример не имеет смысла, потому что в большинстве случаев значение будет истинным.