虽然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)
为什么不呢?我问这个问题充分期待答案是“呃,因为它没有”,但无论如何我都在问,以防这些操作符被遗漏有一个有趣和/或令人沮丧的历史原因。
答案 0 :(得分:25)
我只能猜测 -
如果
a === b
是假的,然后是
a !== b
是真的。的 总是 即可。
但是,这种含义不适用于<==
如果
x <== 20
是假的,我们无法推断出结果
x >== 20
因为类型检查或关系检查可能是假的。
我认为略微令人困惑,尽管语言中有很多东西要糟糕得多(一般都是强制类型,一个名称)。
但是,我认为严格的<
或>
会表现得一致。
答案 1 :(得分:21)
由于a === b
是typeof 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 ¯\_(ツ)_/¯