【问题标题】:An expression evaluates to TRUE when it couldn't possibly be TRUE, could it?当表达式不可能为 TRUE 时,它的计算结果为 TRUE,不是吗?
【发布时间】:2012-12-20 02:22:48
【问题描述】:

我有以下检查,看看一个元素是否应该被视为“悬停”。

我很困惑,因为我看到元素设置为state === 'hover',而它们不应该设置为state === 'hover'

alert 消息更加令人困惑,因为它告诉我们刚刚评估为 true 的表达式是不应该的(如果您从逻辑上考虑的话)。

if( (ig.gui.cursor.pos.x >= element.pos.x) 
    && (ig.gui.cursor.pos.x <= element.pos.x + element.size.x)
    && (ig.gui.cursor.pos.y >= element.pos.y) 
    && (ig.gui.cursor.pos.y <= element.pos.y + element.size.y) 
    && !element.disabled ) {

    state = 'hover';

    alert(

        'This statement evaluates to true: '

        + ig.gui.cursor.pos.x
        + '>='
        + element.pos.x
        + '&&'
        + ig.gui.cursor.pos.x
        + '<='
        + element.pos.x
        + '+'
        + element.size.x
        + '&&'

        + ig.gui.cursor.pos.y
        + '>='
        + element.pos.y
        + '&&'
        + ig.gui.cursor.pos.y
        + '<='
        + element.pos.y
        + '+'
        + element.size.y
        + '&&'

        + ( !element.disabled )

    );

}

上面的代码导致alert这样的消息:

当然,我们都同意580 &lt;= 60 + 48 的计算结果为FALSE,对吧?

然而警报仍然被调用...

【问题讨论】:

  • 使用console.log() 确认你错了(不是alert()
  • 你确定它们都是整数吗?因为我可以看到字符串 "5.."
  • 您比较中的任何值都可能是字符串吗?
  • 可以肯定的是,不要做+ element.pos.x + '+' + element.size.x+ (element.pos.x + element.size.x) 看看你会得到什么

标签: javascript logic expression evaluation operator-precedence


【解决方案1】:

element.pos.x 是一个字符串(“60”)。您需要将其(以及比较中的所有其他字符串)转换回数字。

【讨论】:

  • 如果您将那些+s 替换为-s 或使用前缀+ 运算符,那么您就可以开始了。 element.pos.x + element.size.x -> element.pos.x - -element.size.x+element.pos.x + +element.size.x 因为减法运算符和前缀 + 运算符都将它们的参数强制转换为数字。
  • 如果这个答案是这样的,我相信是这样,那么你最终会得到580&gt;=60580&lt;=6048等。
猜你喜欢
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 2015-05-28
相关资源
最近更新 更多