JavaScript 使用isNaN()测试NaN
示例
window.isNaN()
全局函数isNaN()可用于检查某个值或表达式的计算结果是否为NaN。该函数(简而言之)首先检查该值是否为数字,如果未尝试将其转换为(*),然后检查结果值是否为NaN。因此,此测试方法可能会造成混乱。
(*)“转换”方法不是那么简单,有关算法的详细说明,请参阅ECMA-26218.2.3。
这些示例将帮助您更好地了解isNaN()行为:
isNaN(NaN); //真正 isNaN(1); //假:1是数字 isNaN(-2e-4); //假:-2e-4是科学计数形式的数字(-0.0002) isNaN(Infinity); //假:无穷大是数字 isNaN(true); //假:转换为1,即数字 isNaN(false); //假:转换为0,即一个数字 isNaN(null); //假:转换为0,即一个数字 isNaN(""); //假:转换为0,即一个数字 isNaN(" "); //假:转换为0,即一个数字 isNaN("45.3"); //假:表示数字的字符串,转换为45.3 isNaN("1.2e3"); //假:表示数字的字符串,转换为1.2e3 isNaN("Infinity"); //假:表示数字的字符串,转换为Infinity isNaN(new Date); //假:日期对象,自历元以来转换为毫秒 isNaN("10$"); //真正 : conversion fails, the dollar sign is not a digit isNaN("hello"); //真正 : conversion fails, no digits at all isNaN(undefined); //真正 : converted to NaN isNaN(); //真正 : converted to NaN (implicitly undefined) isNaN(function(){}); //真正 : conversion fails isNaN({}); //真正 : conversion fails isNaN([1, 2]); //真正 : converted to "1, 2", which can't be converted to a number
最后一个有点棘手:检查anArray是否为NaN。为此,Number()构造函数首先将数组转换为字符串,然后转换为数字。这就是为什么原因isNaN([])和isNaN([34])两回false,但isNaN([1,2])和isNaN([true])这两个回报true:因为他们可以转化为"","34","1,2"和"true"分别。通常,除非考虑NaN到数组isNaN()仅包含一个可以将其字符串表示形式转换为有效number的元素,否则它将被视为。
Number.isNaN()
在ECMAScript6中,主要实现了该功能,以避免强制将参数转换为数字的问题。,的确不会在测试之前尝试将值转换为数字。这也意味着仅返回类型为number的值(基本上就是)。Number.isNaN()window.isNaN()Number.isNaN()NaNtrueNumber.isNaN(NaN)
从ECMA-26220.1.2.4:
当Number.isNaN使用一个参数调用时number,将执行以下步骤:
如果Type(number)不是Number,则返回false。
如果为数字NaN,则返回true。
否则,返回false。
一些例子:
//唯一的 Number.isNaN(NaN); //真正 //号码 Number.isNaN(1); //假 Number.isNaN(-2e-4); //假 Number.isNaN(Infinity); //假 //非类型编号的值 Number.isNaN(true); //假 Number.isNaN(false); //假 Number.isNaN(null); //假 Number.isNaN(""); //假 Number.isNaN(" "); //假 Number.isNaN("45.3"); //假 Number.isNaN("1.2e3"); //假 Number.isNaN("Infinity"); //假 Number.isNaN(new Date); //假 Number.isNaN("10$"); //假 Number.isNaN("hello"); //假 Number.isNaN(undefined); //假 Number.isNaN(); //假 Number.isNaN(function(){}); //假 Number.isNaN({}); //假 Number.isNaN([]); //假 Number.isNaN([1]); //假 Number.isNaN([1, 2]); //假 Number.isNaN([true]); //假