【问题标题】:isNaN giving confusing resultsisNaN 给出令人困惑的结果
【发布时间】:2012-08-06 23:35:21
【问题描述】:

我正在编写一个 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”时返回 false,输入“a”时返回 true。但是,checkb 函数在这两种情况下都为 true。

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

令人困惑的特殊情况行为

自 isNaN 函数规范的最早版本以来, 它对非数字参数的行为一直令人困惑。当。。。的时候 isNaN 函数的参数不是数字,值是第一个 强制到一个数字。然后测试结果值以确定 是否为 NaN。因此,对于强制转换为数字的非数字 键入结果为有效的非 NaN 数值(尤其是空字符串 和布尔原语,当被强制赋予数值零或 一)、“false”返回值可能出乎意料;空字符串, 例如,肯定是“不是数字”。混乱源于 事实上,“不是数字”这个词对数字有特定的含义 表示为 IEEE-794 浮点值。函数应该是 解释为回答问题,“这个值,当被强制 一个数值,一个 IEEE-794 'Not A Number' 值?”

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

【问题讨论】:

  • 你不是说A.value in checkb 吗?

标签: javascript html


【解决方案1】:

this(当你打电话给checkb)是window...

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

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

您不会对传递给checkb()this 做任何事情——该函数不会对其任何参数做任何事情。

你的意思可能是:

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

【讨论】:

  • 抱歉,为什么是this window 而不是input
  • 但是,我没有在我正在处理的 HTML 表单中犯同样的错误。不知道怎么回事。
【解决方案2】:

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

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

<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多