72

虽然 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)

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

4

5 回答 5

38

我只能猜测——

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

但是,这个含义不成立<==

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

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

但是,我认为严格的<还是>会表现得始终如一。

于 2013-01-26T02:39:48.147 回答
30

由于a === b是 的简写typeof a == typeof b && a == b,因此您可以将此展开式用于不等式:typeof a == typeof b && a <= b例如。

于 2013-01-26T02:00:46.860 回答
6

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

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

于 2013-01-26T03:21:25.020 回答
0

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

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

现在,两者

x <== 5

x <== '5'

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

于 2014-11-06T07:28:02.770 回答
0

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

假设我们定义一个严格的比较器a <== btypeof a == typeof b && a <= b。对于a >== b. 然后我们比较 a = "3" 和 b = 3 结果是a <== b假的,a >== b假的和a === b假的。恭喜,你刚刚创造了一个悖论!

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

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

请注意,该示例错误地使用list.count了而不是list.length,它只会返回undefined,而i <== undefined

list.count如果 JavaScript 在未定义属性上引发错误,并且比较不同的类型,那会更好。

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

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

于 2016-05-06T03:02:16.090 回答