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

虽然JavaScript的types严格的比较运算符( ===!== )很好,但是它没有相应的严格比较大于/小于。

 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的结果,因为types检查或关系检查可能是错误的。

我认为这有点混乱,尽pipe语言中有很多东西比较糟糕(一般来说就是强制types的强制命名)。

不过,我认为一个严格的<>会performance得一贯。

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

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

在我看来,他们(Brendan Eich,后来ECMAScript委员会)只是决定相信开发者只会比较有意义的比较。 或者甚至没有考虑到开发者会尝试疯狂的比较。 创build额外的运算符进行比较只会混淆语言。 不要忘记,比较不是处理types强制时唯一的缺陷,还有加法,减法等。所以我猜他们只是决定让他们在不同types之间进行操作的决定。 他们认为,当他们知道自己在做什么的时候,他们会帮助他们,但也许没有预料到由此产生的所有困惑。

为了说明为什么它没有意义,请考虑改为…

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

现在,两者

 x <== 5 

 x <== '5' 

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

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

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

这种严格的比较器仍然会搞乱sortingalgorithm,或者比较意外的值。 例如:

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

请注意,该示例是错误地使用list.count而不是list.length ,这将只返回undefined ,这将只是返回false时,相比i <== undefined ,所以for循环将完全跳过程序员的惊喜。

如果JavaScript在list.count为Undefined Property引发一个错误,以及比较不同的types,那会好很多。

这就是我所能说的,跨types的比较应该提出一个例外,就像任何其他体面的语言。 但事实并非如此。

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