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

Why doesn't JavaScript have strict greater/less than comparison operators?

本文关键字:大于 小于 比较 运算符 JavaScript 为什么      更新时间:2023-09-26

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

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

我只能猜测-

如果
a === b是假的,那么
a !== b是真的。总是

但是,这种暗示不会持续<==

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

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

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

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

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

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

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

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

现在,两者都

x <== 5

x <== '5'

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

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

假设我们定义了一个严格的比较器a <== b typeof a == typeof b && a <= ba >== 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相比,它只会返回 false,因此 for 循环将完全跳过,这让程序员感到惊讶。

如果 JavaScript 在 Undefined 属性的list.count上引发错误,以及比较不同类型的错误,我会好得多。

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

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