【问题标题】:Why does "alert(3>2>1)" alert "false" [duplicate]为什么“警报(3> 2> 1)”警报“假”[重复]
【发布时间】:2011-05-01 23:02:16
【问题描述】:

我想问为什么

alert(3>2>1);  // (1)

在 Javascript 中返回 FALSE。

我知道正确的是:

alert(3>2 && 2>1); // (2)

但代码 1 应该返回错误消息或 TRUE!这个等式返回 FALSE 是否有特定原因?

【问题讨论】:

  • 我的猜测是 (1) 被解释为 true > 1 但这是一个疯狂的猜测

标签: javascript


【解决方案1】:

如果您添加括号来显示 JavaScript 是如何解释它的,它会变得更加清晰:

alert( (3 > 2) > 1 );

让我们把它分开。首先,它评估3 > 2。是的,三大于二。因此,您现在有了:

alert( true > 1 );

true 被强制转换为数字。这个数字恰好是11 > 1 显然是错误的。因此,结果是:

alert( false );

【讨论】:

  • @George - ...因为它没有损坏。
  • 修复什么?它可以正常工作。
  • @George - 另外,看在上帝的份上,请每个问题打一个问号。
  • @George:Python 不同,比较这些语言没有意义。你也可以问为什么 Java、C 等不能做到这一点。我同意 JavaScript 可能 在这里抛出语法错误。但是动态类型使它成为可能;)
  • @George 结果没有错 - 这正是语言规范所说的。要么成为下一个大语言的设计者,在你的语言中设置“正确”的东西,要么接受编程语言出于自己的原因有自己的规则。
【解决方案2】:

第一个 3>2 计算结果为 TRUE,可能隐式转换为 1,因此您最终得到 1>1,即 FALSE。

您可能希望在这里出现错误,但 Javascript 的类型非常弱,因此它会尝试进行隐式转换,而不会报错。

编辑:

所以你问为什么编程语言的语法并不总是与数学符号一致?我想说(1)它们有不同的优先级,(2)编译器以另一种方式来做更有意义。

这并不罕见:

  • “x = 3”(语句)和x = 3(赋值)
  • “x >> 1”(远大于 1)和x >> 1(位移)
  • “a | b”(a 除 b)和a | b(按位或)。

名单还在继续……

【讨论】:

    【解决方案3】:

    评估如下:

    +(3>2) > 1
    

    等同于:

    +(true) > 1
    

    最后是:

    1 > 1 = false
    

    但是嘿,至少3 > 2 > 0 可以工作;)

    【讨论】:

      【解决方案4】:

      让我们从根本上分解它,它的两个 > 运算符具有相同的优先级,那么哪个先运行?

      JavaScript 分配了运算符优先级,根据从下载的运算符优先级表 MDN

      大于(>)(表中的 11)从左到右运行,因此 3>2 先运行,其计算结果为 TRUE

      所以现在我们有 TRUE > 1,

      当 JavaScript 看到两种不同类型的值(此处为 bool 和 number)进行比较时,将发生类型强制,这意味着 TRUE 将被强制(类型转换)为 1,

      所以 JavaScript 将以 1>1 运行,结果为 FALSE

      【讨论】:

        【解决方案5】:

        请在下面找到答案:

        3 > 2 > 1 === true;
        

        > 运算符的优先级高于 === 并且是从左到右的关联。如果我们添加隐式括号,我们会得到:

        ((3 > 2) > 1) === true;
        

        这进一步评估为:

        ((3 > 2) > 1) === true;
        (true > 1) === true;
        false === true;
        false;
        

        【讨论】:

          猜你喜欢
          • 2013-01-03
          • 2012-09-20
          • 2018-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多