最后几天我读到了NaN总是比较自己的错误以及如何比较NaN可能发生的事情,现在我做了一个比较两个NaN的JS。 WTF?还是我比较'NaN'字符串?
http://www.bksys.at/bernhard/JS-NaN-compare-true.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>radioactivity calculator</title>
</head>
<body>
<form name="form1">
a: <input type="text" name="a"><br>
b: <input type="text" name="b"><br>
x: <input type="text" name="x"><br>
</form>
<script type="text/javascript">
document.form1.a.value=Math.sqrt(-1);
document.form1.b.value=(1/0)/(1/0);
document.form1.x.value=(document.form1.a.value==document.form1.b.value);
</script>
</body>
</html>
答案 0 :(得分:3)
您确实将字符串"NaN"
与另一个字符串"NaN"
进行比较,这等同于true。文本value
元素中保存的input
始终作为String类型提取。
解决此问题的一种简单方法是使用Unary Plus (+
) operator为您的值添加前缀,将它们转换为整数值(您也可以删除这些括号):
document.form1.x.value = +document.form1.a.value == +document.form1.b.value;
document.form1.a.value = Math.sqrt(-1);
document.form1.b.value = (1/0) / (1/0);
document.form1.x.value = +document.form1.a.value == +document.form1.b.value;
&#13;
<form name="form1">
a: <input type="text" name="a" size="20" value="a"><br>
b: <input type="text" name="b" size="20" value="b"><br>
x: <input type="text" name="x" size="20" value="x"><br>
</form>
&#13;
注意: 正如RobG在下面的评论中指出的那样,重要的是要注意将字符串值"NaN"
转换为具有Unary Plus运算符的整数将其直接转换为NaN
,因为该字符串无法复制为数值。如果您的input
个元素都包含值"Foo"
,或者甚至包含两个完全不同的非数字字符串值,则会发生同样的情况。虽然此解决方案确实有效,但如果您要扩展此代码以处理非数字值,则可能会产生不希望的结果。
答案 1 :(得分:0)
这是一个JavaScript陷阱;)
比较NaN的正确方法是使用isNaN
方法。
var a = 'a' + 5; //NaN
if (isNaN(a)) {
//do something
}
答案 2 :(得分:-1)
NaN
是JavaScript中的特殊值。它甚至不等于自己(也是一种快速的测试方法):
var a = parseInt('seven');
if (a == a) {
alert("a == a");
} else {
alert("a != a"); // This will happen
}
if (a == 'NaN') {
// Won't happen
} else {
alert("NaN is not equal to the string 'NaN'"); // Here
}