为什么isNaN(123。)返回false?

时间:2010-06-10 05:10:57

标签: javascript validation function decimal

为什么Javascript函数调用isNaN(123。)返回false? (注意123之后的点(。))。这是一个普遍接受的数字还是会导致下游错误?

我正在使用isNaN和split来验证值是否为有效小数。 isNaN是否存在跨浏览器问题?我应该使用定制的实现吗?

感谢。

3 个答案:

答案 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。