首页 > 编程学习 > NaN 的 注意点

NaN 的 注意点

发布时间:2022/10/1 8:55:29

NaN

好久没有复习过 NaN 了,现在来温故知新!

NaN

NaN 表示 Not A Number

NaN 属性的属性特性:
writablefalse
enumerablefalse
configurablefalse

NaN 属性的初始值就是 NaN,和 Number.NaN 的值一样。在现代浏览器中(ES5 中), NaN 属性是一个不可配置(non-configurable),不可写(non-writable)的属性。

NaN 如果通过 ==!====、以及 !== 与其他任何值比较都将不相等 – 包括与其他 NaN 值进行比较。必须使用 Number.isNaN()isNaN() 函数。在执行自比较之中:也只有 NaN 不等于它自己。

NaN === NaN;        // false
Number.NaN === NaN; // false
isNaN(NaN);         // true
isNaN(Number.NaN);  // true

注意点

typeof NaN === "number" // true ,虽然 NaN 是“Not a Number”,但是它的类型还是数值类型

NaN === NaN;  // false, NaN 和任何东西都不相等——甚至是它自己本身
NaN == NaN  // false

// 0 除以 0 会返回NaN —— 但是其他数除以 0 则不会返回NaN

/**
	如果isNaN函数的参数不是Number类型, isNaN函数会首先尝试将这个参数转换为数值,然后才会对转换后的结果是否是NaN进行判断。因此,对于能被强制转换为有效的非 NaN 数值来说(空字符串和布尔值分别会被强制转换为数值 0 和 1),返回false值也许会让人感觉莫名其妙
*/

isNaN('') === false
isNaN(true) === false

// isNaN函数其实等同于回答了这样一个问题:被测试的值在被强制转换成数值时会不会返回 IEEE-754​ 中所谓的“不是数值(not a number)”。

Number(undefined) === NaN
isNaN(undefined); // true
isNaN({});        // true
Number(null) === 0
isNaN(null);      // false
Number(34.23) === 34.23

parseInt("123ABC") === 123
Number("123ABC") === NaN
isNaN("");        // false: 空字符串被转换成 0
isNaN(" ");       // false: 包含空格的字符串被转换成 0
undefined +1 			// NaN




isNaN(NaN); // true

isNaN('A String'); // true

isNaN(undefined); // true

isNaN({}); // true

Number.isNaN(NaN); // true

Number.isNaN('A String'); // false

Number.isNaN(undefined); // false

Number.isNaN({}); // false

NaN并不一定用于表示某些值超出表示范围的情况。将某些不能强制转换为数值的非数值转换为数值的时候,也会得到NaN

实现 isNaN 函数:

var isNaN = function(value) {
    var n = Number(value);
    return n !== n;
};

Number.isNaN与isNaN的区别

isNaN(undefined)    // true
Number.isNaN(undefined)  //false

如果要判断一个值是否严格等于NaN,全局的isNaN貌似就无法做到了,因为传进去任何不能转化成数字的值,都会得到true。因为全局的isNaN会把传入的值做类型转换,先转换成数字型,再判断是否==NaN

注意 isNaN()Number.isNaN() 之间的区别:如果当前值是 NaN,或者将其强制转换为数字后将是 NaN,则前者将返回 true。而后者仅当值当前为 NaN 时才为 true

isNaN('hello world');        // true
Number.isNaN('hello world'); // false

总结:就是 isNaN 会先调用 Number(参数)看能不能转换数字类型,然后再进行判断,但是 Number.isNaN 就不会做任何的隐式转化

Copyright © 2010-2022 mfbz.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号