.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?
答案 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")
这将永远是真的,因为:
code == 'ac'
则确实如此。'mw'
,非空字符串也为真。如果你想说:
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