首页 文章

NaN是否等于NaN?

提问于
浏览
41
parseFloat("NaN")

返回“NaN”,但是

parseFloat("NaN") == "NaN"

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

8 回答

  • 33

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

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

  • 4

    Update 2

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

    Original

    检查这个的正确方法是:

    isNaN(parseInt(variable))
    

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

    Using jQuery

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

    Update for jQuery

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

    Documentation of the switch

    如果你看一下this Stack Overflow question,你会发现很多次 isNaN() 返回的是直观的"incorrect"答案,但是规范是正确的 .

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

    从他们的文件:

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

  • 0

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

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

  • 33

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

    function isNaN(x)
    { 
        return x != x; 
    }
    
  • 9
    • Number (由ParseFloat返回)与 string string 比较转换为 Number

    • NaN 不等于任何其他对象(包括 NaN

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

  • 8

    isNaN 适用于非数字的所有值

    isNaN('foo') == true
    isNaN(NaN) == true
    isNaN(12) == false
    isNaN([1,2,3]) == true
    

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

    Number.isNaN('foo') == false
    Number.isNaN(NaN) == true
    Number.isNaN(12) == false
    Number.isNaN([1,2,3]) == false
    
  • 1

    在ECMAScript 6中,Object.is()是===的增强 . 此方法接受两个参数,如果值是等效的,则返回true . 当两个值具有相同类型且具有相同值时,它们被视为等效 . 这是因为console.log(Object.is(NaN,NaN)) - > TRUE

  • 31

    我坚持使用ECMA 5.类似于电咖啡's answer, here' s我能够弄清楚这似乎给出了一个确定的答案,即一个值是否实际上是 NaN ,而不是如果一个值是 NaN 但是如果它实际上是 NaN 本身:

    function isThisNaN(x)
    { 
        return isNaN(x) && Object.prototype.toString.call(x) === '[object Number]'; 
    }
    console.log(isThisNaN(NaN)); // true
    

    大声笑对我来说, Object.prototype.toString.call(NaN) 等于 '[object Number]' . 我的新手大脑告诉我 NaN 是"Not a Number"但遗憾的是它并不那么简单 .

    编辑:我想我应该说我是如何结束这篇文章的 . 我认为这肯定是一个字符串,不会被视为一个数字......好吧,我最终发现了这个:

    isNaN('a'); // true
    isNaN(' '); // false
    

    所以即使 ' ' 是一个非数字字符串,它显然会被哄骗成一个数字( 0 ) .

    console.log(Number(' ')); // 0.0
    

    然而...

    console.log( 0  ? true : false); // false
    console.log(' ' ? true : false); // true
    

    阅读更多后,我确实理解它好一点,但哇新手的心理弊端大声笑

相关问题