Javascript平等三重等于,但是大于和小于呢?

Javascript equality triple equals but what about greater than and less than?

本文关键字:大于 小于 三重 Javascript      更新时间:2023-09-26

我正在向一位同事解释,在比较 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返回相同的结果。 那么第二部分呢...

是否有某种不强制类型的><运算符(或者如何更改测试以安全地执行测试(?

不,不需要这样的运算符。为这些关系运算符执行的类型检查不同于相等和不相等的类型检查。(编辑 - 也许说"没有必要"有点强烈;这只是因为JavaScript认为是这样:-(

具体来说,><以及>=<=运算符都对两个数值或两个字符串进行操作,首选数值。也就是说,如果一个值是数字,则另一个值被视为数字。如果一个非数字不能干净地转换为一个数字(也就是说,如果它最终是NaN(,那么比较的结果是undefined。 (这有点问题,因为undefinedif语句的上下文中看起来像false

如果两个值都是字符串,则改为执行排序顺序字符串比较。

如果你仔细想想,这些比较对对象实例没有任何意义;一个对象"大于"另一个对象意味着什么? 我想,也许,这意味着如果你发现自己的变体类型的值被这样比较,这导致了问题,那么是的,你必须自己检测情况。 在我看来,最好在上游工作并考虑导致这种情况的代码是否存在可疑之处。

是否有某种运算符用于不强制类型的>和<</p>

不。

如何更改测试以安全地执行测试

您必须显式测试这些类型:

typeof a === typeof b && a > b

我参考了 Flanagan 的 JavaScript: The Definitive Guide (第 5 版(,似乎没有非强制性比较运算符。

您说<<和>>确实是按位运算符是正确的,因此这是行不通的。

我建议你故意强迫你自己的价值观:

var num_as_string = '4';
var num = +num_as_string;
if (5 > num) { ... }
12 > '100' // false
'12' > 100 // false
'12' > '100' // true

正如其他人所提到的,如果一个是数字,另一个则转换为数字。相同的规则也适用于这些情况:

null > 0 // false
null < 0 // false
null >= 0 // true

但是,在某些情况下,您可能需要null >= 0给出false(或上面的任何数字字符串比较情况(,因此确实需要严格的比较>==<==

例如,我正在为Array.prototype.sort()编写一个compareFunction,像x>=0这样的表达式会将null值视为 0 并将它们放在一起,而我想将它们放在其他地方。我必须为这些情况编写额外的逻辑。

Javascript说自己处理它(在实践中(。