JavaScript IF 语句错误地评估 TRUE - 为啥?

Posted

技术标签:

【中文标题】JavaScript IF 语句错误地评估 TRUE - 为啥?【英文标题】:JavaScript IF statement evaluating TRUE incorrectly - why?JavaScript IF 语句错误地评估 TRUE - 为什么? 【发布时间】:2013-06-01 19:16:11 【问题描述】:

我对客户购买的许可证数量与他们使用的数量进行了非常非常简单的逻辑测试:

else if(utype == "3")
           var tech_lic = $("#technician_lic").val();
           console.log('tech lic = ' + tech_lic)
           var tech_allow = $("#technician_lic_allow").val();
           console.log('tech allow = ' + tech_allow)
           if(tech_lic >= tech_allow)
            
              alert("You must purchase more licenses to create this Technician");
              return false;
            

我输入了 console.log 语句来尝试调试 - 通常它们不存在。

单击“添加”按钮时的 Console.log:

tech lic = 4    application.js:262
tech allow = 100    application.js:264

然后我们在窗口中点击“您必须购买更多许可证”警报。

什么鬼?

4 >= 100 如何评估为真?

【问题讨论】:

if 语句进行了正确的评估。这是一个字典比较,因此如果“4”大于“100”,则返回 true。 【参考方案1】:

因为.val 返回一个字符串。 '4' 确实大于或等于 '100'。首先将值转换为数字(如果您知道在此比较中它们始终是数字)。

if (+tech_lic >= +tech_allow)

【讨论】:

这是一种隐式转换。从性能的角度来看,隐式转换与使用 parseInt 花费的时间相同,因此它是有效的转换。不过要小心这样的链接,如果你在连续的多个项目上使用隐式强制转换,一些括号可能会有很长的路要走。 @TravisJ 你所说的“一些括号可以走很长的路”是什么意思? @ExplosionPills - 为了确保值之间没有连接。例如,+tech_lic >= +tech_allow + +tech_min 会变得相当草率,因此其中的一些括号将确保导出正确的值。 +tech_lic >= (+tech_allow) + (+tech_min)。这对您来说并不是一个注释,而是对其他可能想要连续在多个值上使用它的人的注释。 @TravisJ — 这不是“隐式转换”,unary + operator 将表达式转换为数字,它与使用 Number(…) 一样明确。并且+x++y 不可能被解释为+x + +y 以外的任何东西(可能被人类除外),ECMAScript 语法并不是那种草率的。 ;-) 你明白了 - 来自 Rails 模型的值之一肯定是整数 - 但另一个是从 COUNT 返回的 - 无论如何,我添加了“to_i”以强制我的值到整数我的观点,并让 javascript 保持原样 - 工作。我给出了正确的答案,因为它们是字符串,尽管我以不同的方式解决了这个问题 - 这是一个巧妙的技巧。【参考方案2】:

您将它们评估为字符串,因此“4”大于“100”。

在比较之前,您需要将它们转换为整数:

var tech_lic = parseInt($("#technician_lic").val(), 10);
var tech_allow = parseInt($("#technician_lic_allow").val(), 10);

【讨论】:

【参考方案3】:

字符串“4”大于“100”,而数字4小于100。

【讨论】:

【参考方案4】:

不是4 >= 100 是真的,而是"4" >= "100" 是真的。

您获得的值是字符串,因此它们将按词法而不是数字进行比较。

将值解析为数字:

var tech_lic = parseInt($("#technician_lic").val(), 10);
var tech_allow = parseInt($("#technician_lic_allow").val(), 10);

【讨论】:

【参考方案5】:

这样做:-

if(Number(tech_lic) >= Number(tech_allow))

   // Do your stuff

【讨论】:

以上是关于JavaScript IF 语句错误地评估 TRUE - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi中if语句的评估顺序

Python 会懒惰地评估 if 的条件吗? [复制]

如何更好地组织这两个连续的 IF 语句?

重构此函数以在 if 语句 Javascript 内部和外部一致地使用“return”

javascript IF语句错误[重复]

如何在 freemarker 中评估 if 语句?