我刚刚在node.js控制台中尝试了以下内容:
> 5 <= "5"
true
这意味着=
的{{1}}部分的处理方式与<=
相同,而不是==
。这使我立即尝试===
希望它会做你希望的那样。但它并不存在。
然后我尝试了以下内容:
<==
然后我开始观察甚至更奇怪的行为:
> 5 < "6"
true
这提出了一个更重要的问题:> 5 < [6]
true
,<
,>
和<=
是否存在类型安全的等价物?
答案 0 :(得分:8)
否,但可以通过正确使用现有语言功能来处理,以进行类型检查。
理想情况下,比较是两种状态逻辑。 a<b
或不是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(); }
。问题是将类型检查与比较相结合将两个状态逻辑改变为三个状态(真/假/无比)。要返回三个结果中的一个,将不再是一个简单的布尔值。
可以使用typeof
或instanceOf
如果比较必须是类型适当的,并且没有编写代码来处理不匹配,那么可以抛出错误来停止执行,如下例所示:
{{1}}
稍后当有错误处理代码时,你可以替换throw或保持throw并使用try / catch。
答案 1 :(得分:1)
不,没有内置任何东西。
考虑:
// I invented ~ as the non type coercion operator
5 <~ 6
5 <~ '6'
这两个都返回错误,但返回值并非真正意味着同样的事情。在第二种情况下,它甚至可能无法比较这些值。