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

时间:2013-01-26 01:58:29

标签: 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)

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

5 个答案:

答案 0 :(得分:25)

我只能猜测 -

如果
a === b是假的,然后是 a !== b是真的。的 总是 即可。

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

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

我认为略微令人困惑,尽管语言中有很多东西要糟糕得多(一般都是强制类型,一个名称)。

但是,我认为严格的<>会表现得一致。

答案 1 :(得分:21)

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:0)

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

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

现在,两者

x <== 5

x <== '5'

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

答案 4 :(得分:0)

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

假设我们将严格的比较器a <== b定义为typeof a == typeof b && a <= b。对a >== b也一样。然后我们比较a =“3”和b = 3,结果为a <== b false,a >== b false和a === b false。恭喜你,你刚刚创造了一个悖论!

这样严格的比较器仍然会搞乱排序算法或比较意外值等问题。例如:

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

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

如果JavaScript在list.count上针对未定义属性提出错误,并且在比较不同类型时也会更好。

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

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