NaN是否等于NaN?

jos*_*eph 45 javascript function nan parsefloat parseint

parseFloat("NaN")
Run Code Online (Sandbox Code Playgroud)

返回"NaN",但是

parseFloat("NaN") == "NaN"
Run Code Online (Sandbox Code Playgroud)

返回false.现在,这确实是一件好事,它确实会返回错误,但我不明白这是怎么回事.JavaScript创建者是否只是将此作为特例?因为否则我无法理解这是如何返回false的.

kri*_*gar 36

更新2

ECMAScript 6的新功能是Object.is()函数.这旨在进一步增强===检查.这个新功能的一个好处是Object.is(NaN, NaN)现在将返回true.如果您能够使用ECMAScript 6,那么这将是您最可读和最一致的解决方案.

原版的

检查这个的正确方法是:

isNaN(parseInt(variable))
Run Code Online (Sandbox Code Playgroud)

如果你检查的是NaN,那么该函数将返回true.此方法内置于JavaScript规范中.

使用jQuery

jQuery isNaN最初构建在自己的函数中,以帮助解决浏览器之间的一些差异,并添加一些额外的检查,以便可以使用它们的版本而不是VanillaJS中的版本.

更新jQuery

在jQuery 1.7之后,他们将此功能更改为$.isNumeric().

交换机的文档

如果你看看这个Stack Overflow问题,你会发现很多时候isNaN()返回的内容会直观地被认为是"不正确"的答案,但是规范是正确的.

避免香草的一个重要原因isNaN()null会返回false,让你觉得它是一个数字.但是,jQuery函数涵盖了更大范围的直观结果.

从他们的文件:

从jQuery 3.0开始,$ .isNumeric()仅在参数类型为number时返回true,或者它的类型为string,并且可以强制转换为有限数字.在所有其他情况下,它返回false.

  • 这与jQuery无关.什么? (12认同)

Phi*_*hil 34

当JavaScript函数返回时NaN,这不是文字字符串,而是全局空间中的对象属性.你无法将它与字符串进行比较"NaN".

请参阅https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN

  • NaN不是一个对象; 它是一种特殊的原始价值.(这恰好是全局对象的只读属性的值). (21认同)

she*_*man 34

这是一个特例,NaN是Javascript中唯一不等于它自己的东西.

虽然关于字符串与NaN对象的其他答案也是正确的.

  • @joseph"NaN"=="NaN"正在比较两个(相等的)字符串. (29认同)

Mar*_*ers 10

NaN是一个与自身不相等的对象的少数例子之一.实际上,这个属性用于实现常用bool IsNaN(number)方法:

function isNaN(x)
{ 
    return x != x; 
}
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很有趣*javascript* (5认同)
  • 将示例从C#更改为JavaScript. (3认同)
  • "几个例子"?又有一个吗?如果是这样,那么这个实现就会失败. (2认同)

Ria*_*iaD 8

  • Number(由ParseFloat返回)与string string转换为Number
  • NaN不等于任何其他对象(包括NaN)

你得到NaN==NaN.第二条规则是错误的.


Ele*_*fee 8

isNaN 适用于非数字的所有值

isNaN('foo') == true
isNaN(NaN) == true
isNaN(12) == false
isNaN([1,2,3]) == true
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要NaN特别检查,或避免类型强制;
你可以Number.isNaN改用

Number.isNaN('foo') == false
Number.isNaN(NaN) == true
Number.isNaN(12) == false
Number.isNaN([1,2,3]) == false
Run Code Online (Sandbox Code Playgroud)