0

我正在编写一个 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));
}

我对结果感到目瞪口呆。该checka函数正常工作时输入“5”时为假,输入“a”时为真。但是,该checkb函数对这两种情况都成立。

我从Mozilla 文档中了解到,isNaN函数可能会在检查输入是否为数字之前先进行类型转换:

令人困惑的特殊情况行为

自 isNaN 函数规范的最早版本以来,它对非数字参数的行为一直令人困惑。当 isNaN 函数的参数不是数字时,首先将值强制转换为数字。然后测试结果值以确定它是否为 NaN。因此,对于非数字,当强制转换为数字类型时会产生有效的非 NaN 数值(尤其是空字符串和布尔基元,当强制转换为数字值 0 或 1)时,“false”返回值可能是意料之外的;例如,空字符串肯定是“不是数字”。混淆源于这样一个事实,即“不是数字”一词对于表示为 IEEE-794 浮点值的数字具有特定含义。该功能应解释为回答问题,

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

4

2 回答 2

8

this(当你打电话时checkb)是window……</p>

(您checkb(this)在没有父对象 ( foo.checkb) 的情况下调用,因此上下文是window自动的。有关进一步阅读,请参阅“this”关键字在 JavaScript 对象文字中如何工作?。)

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

你不会对this你传递给的那个做任何事情checkb()——这个函数不会对它的任何参数做任何事情。

你可能的意思是:

function checkb(A) {
 alert(isNaN(A.value));
}
于 2012-08-06T15:34:42.263 回答
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>
于 2012-08-06T15:35:21.050 回答