我刚刚在node.js控制台尝试了以下操作:
> 5 <= "5"
true
这意味着<=
的=
部分的处理方式与==
相同,而不是===
。这让我立即尝试<==
,希望它能做到你所希望的。但它并不存在。
然后我尝试了以下操作:
> 5 < "6"
true
然后我开始观察更奇怪的行为:
> 5 < [6]
true
这带来了一个更重要的问题:是否存在与<
, >
, <=
和>=
类型安全的等价物?
不,但可以通过正确使用现有语言功能进行类型检查来处理。
比较是理想的双状态逻辑。要么a<b
,要么不是。问题是,将类型检查与比较相结合会将两种状态逻辑变为三种状态(真/假/不可比较)。返回三个结果中的一个将不再是一个简单的布尔值。
对类型的预检查已经可以通过typeof
或instanceOf
实现
如果比较必须是类型适当的,并且没有编写处理不匹配的代码,则可以抛出错误以停止执行,如下例所示:
if (typeof(a) !== typeof(b)) {
throw `type mismatch in some_function(), types: ${typeof(a)}, ${typeof(b)}`;
}
// now the next operation is "safe"
if (a <= b) {
do_something();
} else {
do_the_other_thing();
}
以后出现错误处理代码时,可以替换throw或保留throw并使用try/catch
不,没有内置的东西可以这样做。
考虑:
// I invented ~ as the non type coercion operator
5 <~ 6
5 <~ '6'
两者都返回false,但返回值实际上并不表示相同的东西。在第二种情况下,它甚至可能不会比较值。