我正在编写一个HTML表单,如果输入是一个数字,它会进行一些简单的计算。但是,我的数字输入不被javascript函数视为数字。我很困惑为什么会这样,并使用以下代码3>对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'非数字'值?“
这有助于解释我所看到的现象吗?或者这是另一种与类型转换无关的混淆形式?
答案 0 :(得分:8)
this
(当您致电checkb
时)是window
...
(您在没有父对象(checkb(this)
)的情况下调用foo.checkb
,因此上下文自动为window
。有关详细信息,请参阅How does “this” keyword work within a JavaScript object literal?。)
...所以this.value
是window.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>