javascript - Coffeescript 意外条件评估

标签 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 中创建?

最佳答案

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

expr1 || expr2
Returns expr1 if it can be converted to true; otherwise, returns 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' 并且非空字符串也为 true。
<小时/>

如果你想说:

code is either "mw" or "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]
  # ...

关于javascript - Coffeescript 意外条件评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29288863/

相关文章:

javascript - Chrome 扩展程序可通过扩展程序弹出窗口中的按钮更改 DOM

javascript - Raphael JS - 如何在拱门末端绘制箭头?

javascript - Highcharts.js : Strange rendering of stacked graph

javascript - HTML 中 href 链接的悬停效果

javascript - jQuery Ajax,异步 : false, 返回未定义

javascript - Moment - 获取日期格式部分名称

javascript - Backbone 构造函数调用自身

javascript - AngularJS:如何仅在设置 $scope.var 后才在 View 中设置 $scope.var?

javascript - Coffeescript 树扩展类不工作

javascript - 如何在javascript中将多个单词替换为单个单词?