isNaN给出了令人困惑的结果

时间:2012-08-06 15:31:22

标签: javascript html

我正在编写一个HTML表单,如果输入是一个数字,它会进行一些简单的计算。但是,我的数字输入不被javascript函数视为数字。我很困惑为什么会这样,并使用以下代码jsFiddle进行了一些测试

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));
}

我对结果感到茫然。输入“5”时,checka函数通常会返回false,输入“a”时则为true。但是,checkb函数对两种情况都适用。

我从Mozilla documentation了解到isNaN函数在检查输入之前是否可以先键入转换,无论它是否为数字:

  

混淆特殊情况行为

     

由于isNaN函数规范的最早版本,   它对非数字参数的行为一直令人困惑。当。。。的时候   isNaN函数的参数不是数字,值是第一个   强迫一个数字。然后测试得到的值以确定   是否是NaN。因此对于强制数字时的非数字   输入有效的非NaN数值(特别是空字符串)   和布尔基元,强制时给出数值为零或   一),“假”返回值可能是意外的;空字符串,   例如,肯定是“不是数字”。混乱源于此   事实上,“不是数字”一词对数字具有特定的含义   表示为IEEE-794浮点值。功能应该是   被解释为回答这个问题,“这个价值,当被强迫时   一个数值,一个IEEE-794'非数字'值?“

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

2 个答案:

答案 0 :(得分:8)

this(当您致电checkb时)是window ...

(您在没有父对象(checkb(this))的情况下调用foo.checkb,因此上下文自动为window。有关详细信息,请参阅How does “this” keyword work within a JavaScript object literal?。)

...所以this.valuewindow.value,(大概)undefined,因此不是数字。

您不会对传递给this的{​​{1}}执行任何操作 - 该函数不会对其任何参数执行任何操作。

你可能意味着:

checkb()

答案 1 :(得分: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>