我有一个文本框:
<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?
最佳答案
因为您的input
是number
类型,任何非数字的值都将被解释为空字符串。
所以你最终得到一个空字符串,然后将它传递给 isNaN
。那么会发生什么?参见 isNaN
在规范中:
- If ToNumber(number) is NaN, return true.
- 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/