5

这个说false,意思是""是一个数字:

alert(isNaN("")); 

这个说NaN,意思""是 不是数字,不能转换:

alert(parseFloat(""));

我期待第二个代码转换""为,0因为""在测试时是一个数字,IsNaN但我错了!我是疯了还是我错过了什么?

4

5 回答 5

4

parseFloat尝试从字符串中解析一个数字,其中 as在检查isNaN 参数之前将其转换为数字:

Number("") //0 http://ecma-international.org/ecma-262/5.1/#sec-9.3.1
parseFloat("") //NaN http://ecma-international.org/ecma-262/5.1/#sec-15.1.2.3

显然这是“破碎”或“令人困惑”,所以从规格来看:

ECMAScript 代码测试值 X 是否为 NaN 的可靠方法是 X !== X 形式的表达式。当且仅当 X 为 NaN 时结果才为真。

0 !== 0 // false
NaN !== NaN //true

function isExactlyNaN(x) {
    return x !== x;
}
于 2012-06-07T05:19:32.620 回答
1

isNaN转换为 Number 类型并检查该值是否为特殊数字 NaN。

转换为数字的空字符串是0( +"" === 0),因为0NaN看不到false

然而parseFloat比简单地转换为数字类型更复杂,它返回NaN空字符串 ( parseFloat("") === NaN)。

于 2012-06-07T05:19:01.670 回答
1

不是NaN不等于是一个数字。这只是意味着你不是很特别的价值NaN

或者任何可以NaN通过 JS 语言的神秘转换规则转换的东西。

于 2012-06-07T05:21:32.867 回答
0

Javascript 将空字符串解释为 0 失败 isNaN 测试。至于 parseFloat 尝试解析失败并返回 NaN 的空字符串中的数字。

于 2012-06-07T05:20:32.843 回答
0

要理解这种行为,理解语义很重要。

isNaN检查 value 是否不能强制为数字,如果在 value 上调用它返回 false,则表示Number(value)将返回有效数字。

parseFloat 从字符串中解析数字,如果字符串不以任何数字开头,则返回NaN,因为没有找到要解析的数字。

程序员倾向于过度使用parseIntparseFloat强制,而在大多数情况下他们应该使用Number,这更严格并且没有那么混乱。

于 2012-06-07T16:25:03.000 回答