为什么JavaScript中的parseInt和isNaN行为不一致?

时间:2018-07-04 00:08:37

标签: javascript node.js

我在v8.11.3中使用了node.js。

parseInt("")返回NaN,但是isNaN("")返回false

console.log(
  parseInt(''),
  isNaN('')
);

另一个例子:

console.log(
  parseFloat('0x5'),
  parseInt('0x5')
);

2 个答案:

答案 0 :(得分:3)

每个MDN文档,parseInt

  

如果第一个字符不能转换为数字,则parseInt返回NaN。

空字符串中没有第一个字符-无法将其转换为数字,因此返回NaN

但是isNaN是不同的。正如MDN的第一段所述:

  

注意:isNaN函数内部的强制具有有趣的规则;您可能还想使用ECMAScript 2015中定义的Number.isNaN()。

...

  

当isNaN函数的参数不是Number类型时,该值首先被强制为Number。

当强制为数字时,空字符串为0:

const result = Number('');
console.log(result + ' : ' + typeof result);

您可以尝试使用parseInt然后然后检查结果是否为NaN

const possibleInt = parseInt('');
console.log(Number.isNaN(possibleInt));

答案 1 :(得分:0)

使用Number()只会解决问题。例如:

parseInt("14px"); // 14
parseInt("abc"); // NaN
parseInt(""); // NaN (i.e. null string is a number)

相对于isNaN的使用:

isNaN("14px"); // false
isNaN("abc"); // true
isNaN(""); // false

相对于Number()的使用:

Number("14px"); // NaN
Number("abc"); // NaN
Number(""); // 0

而且,使其变得更加复杂,您甚至无法做到:

parseInt(x) == NaN ? 0 : parseInt(x); 

因为与NaN的比较总是错误的,即使NaN == NaN也是错误的。

我发现的最简单的是:

x=="" || !isNaN(x) ? 0 : parseInt(x);

但这是假设空字符串是唯一的异常,因此它可能无法在所有情况下都起作用。