21

我在向一位同事解释说,在比较 JavaScript 中的变量时,你应该使用and ===!==当然还有),这样它就不会强制参数,让所有的问题变得混乱和混乱,但他们问了我一个我不知道的两部分问题答案并认为我会在这里问专家,具体来说是:>==<==

>和-当<他们比较时,他们是否也强制参数 - 为什么没有某种类型的>><<运算符(可能需要一些其他语法,因为我猜如果它沿着整个 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返回相同的结果。那么第二部分呢...

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

4

4 回答 4

19

不,不需要这样的运营商。对这些关系运算符进行的类型检查不同于对等式和不等式的检查。(编辑——也许说“没有必要”有点过分;这是真的,因为 JavaScript 认为如此 :-)

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

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

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

于 2012-08-27T14:04:46.670 回答
11

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

不。

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

您必须明确测试类型:

typeof a === typeof b && a > b
于 2012-08-27T14:07:39.753 回答
1

我参考了 Flanagan 的 JavaScript:权威指南(第 5 版),似乎没有非强制比较运算符。

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

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

var num_as_string = '4';
var num = +num_as_string;
if (5 > num) { ... }
于 2012-08-27T14:12:16.597 回答
1
12 > '100' // false
'12' > 100 // false
'12' > '100' // true

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

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

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

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

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

于 2017-07-27T16:50:55.263 回答