CoffeeScript-х ||
является в JavaScript ||
и от fine manual for ||
:
expr1 || expr2
Возвращает expr1
, если он может быть преобразован в true
; в противном случае возвращается expr2
.
Таким образом, expr1 || expr2
оценивает первое значение правды (слева направо) в общем выражении. Непустая строка truthy так это:
("ac" || "mw")
просто сложный способ сказать:
"ac"
и это:
if code == ("ac" || "mw")
эквивалентно:
if code == "ac"
и так как вы назначаете code = "mw"
, вы говорите:
if "mw" == "ac"
и ваш console.log
никогда не будет выполнено, так как "mw"
и "ac"
не равны.
В своем ответе вы сказали, что решение есть:
if code == "ac" || "mw"
==
, но имеет более высокий приоритет, чем ||
так что вы на самом деле, говоря:
if (code == "ac") || ("mw")
, и что будет всегда верно, поскольку:
- Если
code == 'ac'
, то это правда.
- В противном случае выражение принимает значение
'mw'
, а также непустые строки.
Если вы хотите сказать:
code
либо "mw"
или "ac"
тогда точно сказать, что:
if code == "mw" || code == "ac"
Если у вас есть Сева Eral кода для проверки, то вы можете использовать массив для хранения кодов, которые вы ищете и indexOf
(или includes
в зависимости от того, каких версий JavaScript вы заботитесь о):
codes = [ 'mw', 'ac', ... ]
if codes.indexOf(code)
#...
# or the CoffeeScripty version, `in` is an `indexOf` call in disguise
codes = [ 'mw', 'ac', ... ]
if code in codes
#...
Если есть много значений, и вы думаю, что линейный поиск массива будет слишком медленным, то вы можете использовать объект для хранения значений (как в комментарии на ваш вопрос):
codes = { mw: true, ac: true, ... }
if codes[code]
# ...
но код! = "Ac", в чем проблема? или, короче говоря, '(« ac »||« mw ») ==« ac », если вы хотите сравнить две возможности, используйте else или LUT:' console.log (!! {ac: 1, mw: 1} [код]); ' – dandavis