NaN 和 isNaN 的彩蛋

作者: 西山以南 | 来源:发表于2019-05-16 17:28 被阅读7次

NaN 是一个全局对象的属性(和 Number.NaN 的值一样),表示不是一个数字(Not-A-Number)。

NaN 的产生

以下场景下都有可能产生 NaN 值:

  • 不定式
0/0;
Infinity/Infinity;
0 * Infinity;
Infinity - Infinity;
Math.pow(1, Infinity);
  • 产生复数结果的运算
// 负数开偶次方
Math.sqrt(-1);
  • 类型转换
'a' - 1;
undefined - 1;
parseInt('a1');
parseFloat('a1');

这里需要注意 parseInt()parseFloat() 的特殊性,与 Number() 的整体转换不同,这两者只转换第一个无效字符之前的字符。

parseInt('1a');    // 1
parseInt('a1');    // NaN

isNaN()

日常编码中很少会直接操作 NaN 值,一般会在数值运算出现异常时出现,那么我们如何判断一个值是否为 NaN 呢?

NaN == NaN;     // false
NaN === NaN;    // false

可怕!NaN 自身居然不等于自身(这也是 JS 值中唯一一个如此特殊的)。所以等号运算符是不能正确判断的,只能通过 isNaN() 函数。

然而,isNaN() 函数也并不如其名 —— 判断是否为(数字类型下的)非法数字,更准确的说是 判断一个值在转换成数字类型后是否为非法数字

isNaN('1');      // 1
isNaN([]);       // 0
isNaN(false);    // 0

这是因为,如果 isNaN() 函数的参数不是 Number 类型, isNaN 函数会首先尝试将这个参数转换为数字类型,然后才会对转换后的结果是否是 NaN 进行判断。

这里收集了一些特殊值在转换为数字类型和 NaN 判断时的表现。除了 Number()isNaN() 函数在不传参数的情况下有差异之外,其他表现都是符合预期的。

参数 Number isNaN
0 true
undefined NaN true
null 0 false
true 1 false
false 0 false
'' 0 false
{} NaN true
[] 0 false
[1] 1 false
[1, 2] NaN true

但我们可以通过预判断参数是否为数字类型来优化 isNaN 函数:

var _isNaN = function(v) {
  return typeof v === 'number' && isNaN(v);
}

Number.isNaN()

ES6 提供了 Number​.isNaN() 函数,不会强制将参数转换为字。也就是说,只有在参数为数字类型且值为 NaN 时才会返回 true

Number.isNaN(null);    // false
Number.isNaN('1');     // false

Reference

相关文章

  • NaN 和 isNaN 的彩蛋

    NaN 是一个全局对象的属性(和 Number.NaN 的值一样),表示不是一个数字(Not-A-Number)。...

  • NaN和isNaN

    刚认识NaN时,脑子很明白NaN的意思是:不是一个数(not a number)。 var...

  • NAN以及数值转换

    alert(isNAN(NAN)) //truealert(isNAN(10)) //falsealert...

  • JS中奇葩问题

    js 中NaN和NaN是不相等的,如果想判断一个value是否是NaN,可以使用isNaN(Value)

  • 原生JS篇四、关于javascript中的NaN和isNaN()

    本文章内容: 什么是NaN以及产生NaN的场景 关于isNan()方法 NaN是什么? NaN(Not a Num...

  • Number类型(NaN和isNaN)

    1.number类型 NaN:NaN属性代表一个“不是数字”的值。这个特殊的值是因为运算不能执行而导致的,不能执行...

  • NaN是什么数据类型

    NaN是数字类型的,但是它又可以用isNaN()检测,isNaN() 函数用于检查其参数是否是非数字值 isNaN...

  • JS中的NaN和isNaN

    一、NaN:not a number 不是个数字的数字类型 但是属于数字类型 注意:一旦程序出现NaN,肯定进行...

  • ES6之数值的扩展(上)

    Number.isNaN 我们知道isNaN曾是window下边的属性,用来判断是否是NaN(非数值))类型的。现...

  • js 基础

    0/0 ==> NaN(Not a Number)可以通过isNaN()检测值是否为NaN 转意符 ' 单引号\n...

网友评论

    本文标题:NaN 和 isNaN 的彩蛋

    本文链接:https://www.haomeiwen.com/subject/pgdiaqtx.html