2012-08-06 44 views
0

我正在写一个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的'非数字'值?”

这有助于解释我所看到的现象吗?或者这是另一种与类型转换无关的混淆形式?

+0

难道你不是指在'checkb'中的'A.value'? – 2012-08-06 15:36:25

+0

啊,是的,我的错。 – 2012-08-06 15:38:10

回答

8

this(当你调用checkb)是window ......

(你叫checkb(this)没有父对象(foo.checkb)这样的背景下是window自动。如需进一步阅读,请How does “this” keyword work within a JavaScript object literal?

...等等this.valuewindow.value这是(推测)undefined,因此不是一个数字。

您不会对this执行任何操作,而是将其传递给checkb() - 该函数不会对其任何参数执行任何操作。

你大概的意思是:

function checkb(A) { 
alert(isNaN(A.value)); 
} 
+0

对不起,为什么'这个''window''而不是'input'? – 2012-08-06 15:36:46

+0

@QuestionOverflow - 查看编辑。 – Quentin 2012-08-06 15:38:42

+0

我很抱歉,我的错误,这是一个学校男孩的错误。 – 2012-08-06 15:39:36

1

this.value是不确定的,这是窗口对象,而不是输入。

如果您想使用它来指向输入,您需要以不显眼的方式分配事件处理程序。

<form> 
<input name=b type=number value='' id="b"> 
</form> 

<script>  
function checkb(A) { 
    alert(isNaN(this.value)); 
}  
document.getElementById("b").oninput = checkb; //better to use an addEventListener 
</script>