咖啡脚本意外的条件评估

Coffeescript Unexpected Conditional Evaluation

本文关键字:条件 评估 意外 脚本 咖啡      更新时间:2023-09-26

.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

为什么我不在如果里面做?

CoffeeScript 的||是 JavaScript 的||,来自 || 的精美手册:


expr1 || expr2 如果可以转换为true,则返回expr1;否则,返回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要么是"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]
  # ...

这是要看的部分

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

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