为什么Javascript函数调用isNaN(123。)返回false? (注意123之后的点(。))。这是一个普遍接受的数字还是会导致下游错误?
我正在使用isNaN和split来验证值是否为有效小数。 isNaN是否存在跨浏览器问题?我应该使用定制的实现吗?
感谢。
答案 0 :(得分:18)
在JavaScript中,Numeric Literal的语法表示如下:
DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt
正如您可以看到点后面的DecimalDigits
部分是可选的(选择后缀)。
var n = 123.;
typeof n; // "number"
我不建议使用isNaN
函数来检测数字,因为类型强制可以使某些内容看起来像奇怪:
isNaN(""); // false, a empty string coerces to zero
isNaN("\n\t"); // false, a white-space string coerces to zero
isNaN(true); // false, boolean true coerces to 1
isNaN(false); // false, boolean false coerces to zero
isNaN(new Date); // false, Date objects coerce to its numeric timestamp
// etc...
isNaN
应仅用于与NaN
进行比较,因为:
NaN == NaN; // false!
IsNaN(NaN); // true
如果您想检测Number
个对象,Number
值或“可解析”数字字符串,请查看我前段时间发布的this function。
答案 1 :(得分:1)
NaN
或(不是数字)是特定的浮点值,意味着一个无法由计算机表示的值(使用IEEE 754 floating point standard)。
至关重要的是,isNaN()
函数尽最大努力将数字转换为浮点数,这就是您的示例返回true的原因。例如,见:
isNaN(100); //Returns false
isNaN("100"); //Returns false
isNaN("ABC"); //Returns true
isNaN("10C"); //Returns true
isNaN(Math.sqrt(-1)); //Returns true
如果您想要将"123."
这样的数字作为浮点数使用,请尝试使用parseFloat()
:
parseFloat("123."); //Returns 123
此外,123.
是javascript中的有效数字,小数点后不需要小数部分。 所以isNan()
的行为正确,在这种情况下应该返回false。
答案 2 :(得分:0)
该函数称为“不是数字”。因此,如果输入数字,则应返回false,否则返回true。即使背后有点,这个数字仍然有效。 123.只需验证为123或123.0。