为什么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 === b
是typeof 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 <== b
是typeof 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¯ ¯\_(ツ)_/¯