javascript - isNaN 对字母返回 false

标签 javascript knockout.js

我有一个文本框:

<input type="number" min="0" max="100" value="1" class="form-control" data-bind="value: number,  valueupdate:'afterkeydown'" required="">

它绑定(bind)到这个 viewModel:

var ViewModel = function () {
    var self = this;
    self.number = ko.observable(1);
    }

稍后在 viewModel 中,我有一个函数可以检查值 Number 是否真的是一个数字并且大于 1:

if (self.number() < 1 || isNaN(self.number()) {
   console.log(isNaN(self.number());
   alert("Error");
   return true;
}

我检查了如下输入:

  • 一个
  • 一个
  • asdsfdsfs
  • 1

对于所有这些 isNaN(self.number()) 返回 false

什么会导致这个错误?

@更新: 我检查了 console.log(self.number()) 对于字母输入,它返回空字符串。那么为什么 isNaN 返回 false 而不是 true?

最佳答案

因为您的inputnumber 类型,任何非数字的值都将被解释为空字符串。

所以你最终得到一个空字符串,然后将它传递给 isNaN。那么会发生什么?参见 isNaN在规范中:

  1. If ToNumber(number) is NaN, return true.
  2. Otherwise, return false.

所以“ToNumber”是用空字符串调用的。当对其应用“ToNumber”操作时,空字符串强制转换为 0,并且 0 不是 NaN。参见 ToNumber Applied to the String Type在规范中:

The MV of StringNumericLiteral ::: [empty] is 0.

关于javascript - isNaN 对字母返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22830085/

相关文章:

javascript - 将鼠标悬停在图标上以显示未锻炼的标题

c# - Ajax TabContainer 在 Postback 上间歇性消失

javascript - Durandal 2.0 小部件处理

knockout.js - knockout 显示选择数据

knockout.js - 具有可观察子类的 knockout

jquery - knockoutjs通过点击事件获取元素id

javascript - 从 Coffee(或 Type)翻译为 vanilla js 语言

javascript - jQuery 不返回数据

javascript - 为什么我的 dc-js 轴显示得这么粗,而刷子过滤器显示为不透明的黑色?

javascript - knockoutjs,可观察对象相互更新