咖啡脚本意外的条件评估
Coffeescript Unexpected Conditional Evaluation
.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")
这永远是正确的,因为:
- 如果
code == 'ac'
那么这是真的。 - 否则,表达式的计算结果为
'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
相关文章:
- 通过js在新选项卡中有条件地打开url
- 我已经创建了一个jquery转盘,并使用if条件来运行和停止转盘
- 如何检查链接是否有文本,并根据文本值评估条件-Jquery/JS
- 咖啡脚本意外的条件评估
- 评估作为参数传递给 Google 电子表格中自定义函数的条件
- AngularJs针对多个条件评估表达式
- 如何评估带有大量&&和||条件
- 条件被颠倒地评估
- 如果未评估条件 - 则所有选项都不匹配
- 必填字段的条件评估
- 这个评估条件的目的是什么
- 条件表达式的评估
- Javascript 在 while 循环中评估多个条件
- 功能障碍条件评估页面宽度
- if语句未按预期评估条件
- 更快地评估JavaScript的IF条件
- 在javascript中评估条件时出现问题
- 在重新评估if-else语句的条件后,如何阻止JQuery函数被调用
- if 语句 - 条件评估时间(Javascript)
- 条件运算符 - 使用 &&&|| 的单线短路评估在 JavaScript 中