.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
Returnsexpr1
if it can be converted totrue
; otherwise, returnsexpr2
.
所以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")
这永远是正确的,因为:
- 如果
code == 'ac'
则为真。 - 否则表达式的计算结果为
'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/