Coffeescript意外的条件评估

时间:2015-03-26 21:06:06

标签: javascript coffeescript

.js.coffee

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

为什么我不进入if?

2 个答案:

答案 0 :(得分:2)

CoffeeScript的||是JavaScript的||,来自fine manual for ||

  

expr1 || expr2
  如果可以转换为expr1,则返回true;否则,返回expr2

所以expr1 || expr2评估整个表达式中的第一个真值(从左到右)。一个非空字符串是真的,所以这个:

("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',非空字符串也为真。

  3. 如果你想说:

      

    code可以是"mw""ac"

    然后准确地说:

    if code == "mw" || code == "ac"
    

    如果您要检查多个代码,那么您可以使用数组来保存您要查找的代码和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]
      # ...
    

答案 1 :(得分:1)

这是要查看的部分

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

评估为if code == "ac" //this is false so it doesn't print anything