2015-03-26 3 views
0

.js.coffee:CoffeeScript Неожиданное Условная оценка

code = "mw" 
console.log code == "mw"      # true 
console.log code == ("ac" || "mw" || "ga") # false 
if code == ("ac" || "mw") 
    console.log "inside if"     # never reached 

Почему я не делаю внутри, если?

+0

но код! = "Ac", в чем проблема? или, короче говоря, '(« ac »||« mw ») ==« ac », если вы хотите сравнить две возможности, используйте else или LUT:' console.log (!! {ac: 1, mw: 1} [код]); ' – dandavis

ответ

2

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") 

, и что будет всегда верно, поскольку:

  1. Если code == 'ac', то это правда.
  2. В противном случае выражение принимает значение '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] 
    # ... 
+0

Спасибо за разъяснение! Этот случай упрощен, я сравниваю одну строку со многими другими строками (5+) и надеялся на способ сделать это в сжатом виде, но, похоже, разбивает ее на несколько условностей, разделенных символом "||" это способ пойти –

+1

Если у вас их много, вы можете сказать такие вещи, как '['ac', 'mw']' .indexOf (code)! = -1' (что является медленным линейным поиском) или конвертировать их к объекту (как в комментарии к вашему вопросу) и скажите 'codes = {ac: true, mw: true, ...}; если (коды [код]) '. –

1

Это раздел, чтобы посмотреть на

if code == ("ac" || "mw") 
    console.log "inside if" 

Оценка: if code == "ac" //this is false so it doesn't print anything

Смежные вопросы