Javascript, как использовать оператор и / или оператор с круглыми скобками

У меня есть объект, который содержит строку HelloWorld в атрибуте hello, Я хочу проверить наличие двух строк, и, если они не совпадают ни с одной из них, я хочу выполнить определенный код.

var item = { hello: "HelloWorld" }
item.hello !== "HelloWorld" && item.hello !== "GoodbyeWorld" // false, correct

Однако я чувствую, что это можно оптимизировать и сделать более читабельным:

item.hello !== ("GoodbyeWorld" && "HelloWorld") // false, correct
item.hello !== ("HelloWorld" && "GoodbyeWorld") // true   WTF?

Я ожидал, что обе проверки будут ложными, но, конечно, я что-то здесь упускаю. Я думаю, что у меня нет правильного понимания оператора AND/OR в javascript, или я неправильно использую скобки. Кто-нибудь может объяснить?

Пример JSFiddle

4 ответа

Решение

Результат "HelloWorld" && "GoodbyeWorld" является "GoodbyeWorld" вот почему вы получаете результат, которым вы были, предыдущий способ, которым вы делали это, является самым простым решением

Давайте посмотрим на эту строку

item.hello !== ("HelloWorld" && "GoodbyeWorld") // true WTF?

Логический оператор AND вычисляет свой правый операнд, если lVal это истинная ценность.

Обратите внимание, истинное значение - это каждое значение, которое не является ложным ( null,false,0,"",undefined,NaN )

поскольку "HelloWorld" действительно правда

Выражение ("HelloWorld" && "GoodbyeWorld") оценивает "GoodbyeWorld" и вы эффективно сравниваете

item.hello !== "GoodbyeWorld" который может быть уменьшен до "HelloWorld" !== "GoodbyWorld"

Следовательно, это true


Однако, если вы находитесь в ES5-совместимой среде, вы можете использовать Array.prototype.indexOf чтобы упростить это.

!~["HelloWorld","GoodbyWorld"].indexOf(item.hello) //false

выше возвращает истину, если item.hello не содержится в массиве

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

Оператор && использует оценку короткого замыкания, что означает, что если первый операнд верен, он просто вернет второй операнд.

Итак, ваш код выполняет сравнение значения свойства hello со второй строкой, которая объясняет полученные результаты.

item.hello !== "HelloWorld" && item.hello !== "GoodbyeWorld"

правильный способ проверить, item.hello отличается от "HelloWorld" а также "GoodbyeWorld",

Выражение A && B в JavaScript дает результат, который либо A или же B и это тот результат, который сравнивается с вашим item.hello,

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