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, или я неправильно использую скобки. Кто-нибудь может объяснить?
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
,