为什么JavaScript没有严格大于/小于比较运算符?

mwc*_*wcz 58 javascript

虽然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)
Run Code Online (Sandbox Code Playgroud)

为什么不?我问这个问题充分期待答案是"呃,因为它没有",但我无论如何都要问,以防这些操作符被忽略有一个有趣和/或令人沮丧的历史原因.

goa*_*oat 25

我只能猜测 -

如果
a === b是假的话,那
a !== b就是真的.永远.

但是,这种含义并不适用 <==

如果
x <== 20为false,我们无法推断结果, x >== 20因为它可能由于类型检查或关系检查而为假.

我认为这有点令人困惑,尽管语言中有很多东西要糟糕得多(一般来说类型强制,一个名字).

但是,我认为严格<>表现一致.

  • 这种推理并不符合JavaScript的现实.尝试`5>"你好"`和`5 <="你好"`.两者都是"假",所以无论如何都没有含义.你提出的这个问题即使在强制下也已经存在. (12认同)

Nie*_*sol 22

既然a === b是简写typeof a == typeof b && a == b,你可以使用这种扩展来表示不等式:typeof a == typeof b && a <= b例如.

  • 我的问题是"为什么",而不是"如何".有关"如何"的讨论,请参阅我发布的链接. (8认同)
  • +1,好解释!;)我要补充一点===检查篮子里相同类型的水果,并且无法确定天气苹果> ==橙色.这根本不是定性比较.也许这回答了"为什么"的部分? (3认同)

bfa*_*tto 5

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

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