我正在写一个HTML表单,如果输入是一个数字,它会做一些简单的计算。但是,我的号码输入不被javascript函数视为一个数字。我很困惑,为什么会是这样,并使用下面的代码isNaN给出了令人困惑的结果
HTML
<form>
<input name=a type=number value='' oninput='checka();'>
<input name=b type=number value='' oninput='checkb(this);'>
</form>
的Javascript
function checka() {
alert(isNaN(document.forms[0].a.value));
}
function checkb(A) {
alert(isNaN(this.value));
}
我对结果目瞪口呆做了一些测试与jsFiddle。当输入'5'时,checka
函数正常工作,假如输入'a',则为真。但是,checkb
函数在两种情况下都是正确的。
我从Mozilla documentation明白isNaN
功能可能会做类型转换首先检查是否由于输入的是数字或不前:
混淆特殊情况的行为
由于在非常早的版本isNaN函数规范, 其对非数字参数的行为一直令人困惑。当isNaN函数的参数 不是数字时,该值首先被强制为一个数字 。然后测试结果值以确定 是否为NaN。因此,对于强制为数字 类型的非数字,会生成有效的非NaN数值(特别是空字符串 和布尔基元,当强制给出数值0或 之一)时,“假”返回值可能会意想不到的;例如,空字符串 肯定“不是数字”。该混淆源于事实,即“不是数字”一词对于表示为IEEE-794浮点值的数字 具有特定含义。函数应该是 解释为回答问题,“是这个值,当强制为 的数值时,IEEE-794的'非数字'值?”
这有助于解释我所看到的现象吗?或者这是另一种与类型转换无关的混淆形式?
难道你不是指在'checkb'中的'A.value'? – 2012-08-06 15:36:25
啊,是的,我的错。 – 2012-08-06 15:38:10