isNaN对字母返回false

时间:2014-04-03 06:58:22

标签: javascript knockout.js

我有一个文本框:

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

它绑定到viewModel

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

稍后在viewModel我有函数,我检查值Number是否真的是一个数字而不是一个:

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

我检查了输入:

  • A
  • 一个
  • asdsfdsfs
  • 1

所有人isNaN(self.number()) returns false

有什么可以解决这个错误?

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

1 个答案:

答案 0 :(得分:4)

由于您的input类型为number,因此任何非数字值都将被解释为空字符串。

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

  
      
  1. 如果ToNumber( number )为NaN,则返回true。
  2.   
  3. 否则,返回false。
  4.   

因此使用空字符串调用“ToNumber”。当应用“ToNumber”操作时,空字符串强制转换为0,而0不是NaN。请参阅规范中的ToNumber Applied to the String Type

  

StringNumericLiteral ::: [empty]的MV为0.