我向同事解释,在比较JavaScript中的变量时,您应该使用===
和!==
(当然还有>==
和<==
)强迫论证并让所有人感到困惑但是他们问了我一个我不知道答案的两个问题,并且我想在这里问专家,具体是:
>
和<
怎么样?当他们比较时,他们是否也强迫论证 - 为什么不存在某种>>
和<<
运算符(可能需要一些其他的语法,因为我猜他们会是位移操作符,如果它是沿着整个C风格,但你得到的要点)?
所以我可以写一个测试来找到第一部分的答案,我做了,这是:
// Demo the difference between == and ===
alert(5 == "5");
alert(5 === "5");
// Check out what happens with >
alert(5 > "4");
alert(5 > 4);
然后又回来了:
true
false
true
true
所以看起来>
正在进行强制执行,因为> "4"
和> 4
会返回相同的结果。那么第二部分怎么样......
>
和<
是否存在某种不强制类型的运算符(或者我如何更改测试以安全地执行测试)?
答案 0 :(得分:15)
不,没有必要这样的运营商。为那些关系运算符进行的类型检查不同于对于相等和不平等的类型检查。 (编辑 - 也许说“没有必要”有点强烈;这只是因为JavaScript认为如此: - )
具体来说,>
和<
以及>=
和<=
运算符都可以在两个数值或两个字符串上运行,而不是数字值。也就是说,如果一个值是数字,则另一个值被视为数字。如果无法将非数字干净地转换为数字(即,如果它最终为NaN
),则比较结果为undefined
。 (这有点问题,因为undefined
在false
语句的上下文中看起来像if
。)
如果两个值都是字符串,则执行整理顺序字符串比较。
如果你考虑一下,这些比较对于对象实例没有任何意义;对象“大于”另一个对象意味着什么?我想,也许,这意味着,如果你发现自己的变体类型的值被比作这样,并且这会导致问题,那么是的,你必须自己检测这种情况。在我看来,在上游工作并考虑是否存在导致这种情况的代码有些可疑的事情会很好。
答案 1 :(得分:8)
是否有某种运算符用于&gt;和&lt;不强制类型
没有
如何更改测试以安全地执行测试
您必须明确测试类型:
typeof a === typeof b && a > b
答案 2 :(得分:1)
我引用了Flanagan的JavaScript:The Definitive Guide(第5版),并且似乎没有非强制性比较运算符。
你说&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;和&gt;&gt;确实是按位运算符,因此不起作用。
我建议你刻意强迫自己施展价值观:
var num_as_string = '4';
var num = +num_as_string;
if (5 > num) { ... }
答案 3 :(得分:1)
12 > '100' // false
'12' > 100 // false
'12' > '100' // true
正如其他人所提到的,如果一个是数字,另一个是数字。同样的规则也适用于这些案例:
null > 0 // false
null < 0 // false
null >= 0 // true
但是,在某些情况下,您可能需要null >= 0
来提供false
(或上面的任何数字字符串比较情况),因此确实需要严格比较>==
或<==
。
例如,我正在为compareFunction
撰写Array.prototype.sort()
,而像x>=0
这样的表达式会将null
值视为0并将它们放在一起,而我想把它们放在其他地方。我必须为这些案件编写额外的逻辑。
Javascript说你自己处理它(在实践中)。