【问题标题】:Why doesn't JavaScript have strict greater/less than comparison operators?为什么 JavaScript 没有严格的大于/小于比较运算符?
【发布时间】:2013-01-26 01:58:28
【问题描述】:

虽然 JavaScript 的类型严格比较运算符(===!==)很不错,但它没有对应的大于/小于的严格比较。

var x = 10;

x <= 20;    // true
x <= '20';    // true
x <== 20;   // true (or would be, if JS had such an operator)
x <== '20'; // false (ditto)

为什么不呢?我问这个问题完全期待答案是“呃,因为它没有”,但我还是要问,以防这些运算符被省略的有趣和/或令人沮丧的历史原因。

【问题讨论】:

标签: javascript


【解决方案1】:

我只能猜测-

如果
a === b 为假,则
a !== b 为真。 总是

但是,这个含义不适用于&lt;==

如果
x &lt;== 20 为假,我们无法推断结果 x &gt;== 20 因为类型检查或关系检查可能是错误的。

我认为这有点令人困惑,尽管语言中有很多更糟糕的东西(一般是类型强制,仅举一例)。

但是,我认为严格的 &lt;&gt; 会表现一致。

【讨论】:

  • 这种推理不符合 JavaScript 的实际情况。试试5 &gt; "hello"5 &lt;= "hello"。两者都是false,所以这个含义无论如何都不成立。即使使用强制,您建议的问题也已经存在。
  • 如果类型不匹配抛出异常如何?
【解决方案2】:

由于a === btypeof a == typeof b &amp;&amp; a == b 的简写,您可以使用此扩展来表示不等式:例如typeof a == typeof b &amp;&amp; a &lt;= b

【讨论】:

  • 我的问题是“为什么”,而不是“如何”。有关“如何”的讨论,请参阅我发布的链接。
  • +1,很好的解释! ;) 我要补充一点,=== 检查篮子中是否有相同类型的水果,并且无法确定天气苹果 >== 橙色。这根本不是定性比较。也许这回答了“为什么”部分?
  • 这仍然正确吗?因为我一直在阅读文档和确定平等的算法。它在他们的网站上说== 使用=== 而不是相反...例如如果它们相等,则类型 == 使用 ===。如果它们是不同的类型,则操作数将转换为相同的类型,然后再次使用===
  • @user3475902 - 它在谁的网站上说? ECMA 262, 6th Edition, 7.2.12 声明 === 当且仅当操作数的类型相同时使用。如果类型不同,则尝试强制。所以是的,这个答案仍然是正确的,因为比较类型在功能上等同于=== 的标准(尽管称其为“速记”并不十分准确)。
【解决方案3】:

我不确定您的问题是否有答案。我的猜测是,预期用途是将数字与字符串(可能还有布尔值)进行比较。它实际上适用于这些情况,就像非严格相等运算符一样。无论如何,其他任何东西都受任意类型强制规则的约束。 [] &lt; {} 的“正确”输出是什么? false?也许undefined?请注意,类型甚至不需要不同,({foo: 1}) &lt; {bar : 2} 也没有任何意义。

在我看来,他们(Brendan Eich,以及后来的 ECMAScript 委员会)只是决定相信开发人员只会比较有意义的东西。或者甚至没有考虑到开发人员会尝试疯狂的比较。创建额外的运算符进行比较只会使语言混乱。并且不要忘记比较不是处理类型强制时唯一的陷阱,还有加法、减法等。所以我猜他们只是决定忠实于他们允许不同类型之间的操作的决定。他们认为当人们知道自己在做什么时,这会有所帮助,但也许没有预料到由此引起的所有困惑。

【讨论】:

    【解决方案4】:

    要说明为什么拥有它没有意义,请考虑...

    var x = 10
    var less = (x <= 5)
    

    现在,两个

    x <== 5
    

    x <== '5'
    

    可能是错误的,但出于不同的原因。在第一种情况下,您可以使用 x > 5 的假设,但不能在后一种情况下使用。为避免错误假设,最好先使用 === 或 !==,然后再进行比较。

    【讨论】:

      【解决方案5】:

      我想说的问题是可以为不同类型很好地定义严格相等(不是相同类型,然后不等于),但不能为不同类型很好地定义关系运算符。

      假设我们将严格的比较器a &lt;== b 定义为typeof a == typeof b &amp;&amp; a &lt;= ba &gt;== b 也是如此。然后我们比较 a = "3" 和 b = 3,结果是 a &lt;== b false、a &gt;== b false 和 a === b false。恭喜,你刚刚创造了一个悖论!

      如此严格的比较器仍然会弄乱诸如排序算法或比较意外值之类的事情。例如:

      for (var i; i <== list.count; i++) {
        doStuff(i);
      }
      

      请注意,该示例错误地使用了list.count 而不是list.length,它只会返回undefined,与i &lt;== undefined 相比只会返回false,因此for 循环将被完全跳过以防意外程序员。

      如果 JavaScript 在 list.count 上为未定义属性引发错误,以及比较不同类型时,我会更好。

      我只能这么说,跨类型比较应该引发异常,就像任何其他体面的语言一样。但事实并非如此。

      这意味着,实际可行的解决方案是开始使用预处理器,或者只是说“哦,好吧”并继续输入 JavaScript ¯\_(ツ)_/¯

      【讨论】:

        猜你喜欢
        • 2018-09-23
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        • 2013-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多