JavaScript中的NaN,是Not-A-Number的缩写,表示“不是数字”的意思。NaN是一种特殊的数字类型,它属于全局对象的一部分,本身就是一个全局变量。
1. NaN的产生
NaN的产生是因为数学运算的不合理导致的。举个例子:
var result = 10 / "hello";
console.log(result); // NaN
在上面的例子中,我们试图用数值除以一个字符串。在数学上是不合法的,因此会返回一个NaN。类似地,对于数据类型不匹配的操作都会返回NaN。
2. NaN的判断
NaN有一个非常奇怪的特性,它与任何值都不相等,包括它自己。所以不能用==符号来判断是否为NaN。正确的方法是用isNaN()函数来判断。
2.1 isNaN()函数的使用
isNaN()函数会将传入的参数转换为数字,如果不能转换为数字,会返回true;如果能转换为数字,则返回false。以下几种情况都会返回true:
传入的是非数字或者不能转换为数字的字符串。
传入的是null。
传入的是一个空字符串。
传入的是一个Boolean值。
传入的是一个未定义的变量。
以下几种情况返回false:
传入的是数字,包括Infinity和-Infinity。
传入的是一个可以被转换为数字的字符串。
console.log(isNaN("hello")); // true
console.log(isNaN(null)); // true
console.log(isNaN("")); // true
console.log(isNaN(true)); // true
console.log(isNaN(undefined)); // true
console.log(isNaN(123)); // false
console.log(isNaN("-123")); // false
2.2 Object.is()函数的使用
ES6中新增了Object.is()函数,用于比较两个值是否相等。它与==和===的区别在于,==和===对于NaN的判断结果不同。
console.log(Object.is(NaN, NaN)); // true
console.log(NaN == NaN); // false
console.log(NaN === NaN); // false
可以看到,Object.is()函数的结果返回true,而==和===运算符则返回false,这是因为Object.is()函数认为NaN不等于任何其他值,包括它自己。
3. NaN的应用场景
NaN虽然看起来很奇怪,但在实际开发中有很多应用场景。
3.1 判断一个值是否是数字
用typeof运算符可以判断一个变量是否为数字,但它无法判断NaN。而isNaN()函数可以。
function isNumber(value) {
return typeof value === 'number' && !isNaN(value);
}
console.log(isNumber(123)); // true
console.log(isNumber("123")); // true
console.log(isNumber(NaN)); // false
3.2 将字符串转换为数字
当我们需要将一个字符串转换为数字时,通常使用parseInt()或parseFloat()函数。这两个函数会返回一个数字,但是如果无法转换,则会返回NaN。
console.log(parseInt("123")); // 123
console.log(parseInt("123hello")); // 123
console.log(parseInt("hello")); // NaN
console.log(parseFloat("3.14")); // 3.14
console.log(parseFloat("3.14hello")); // 3.14
console.log(parseFloat("hello")); // NaN
3.3 判断数组是否包含NaN
有时候我们需要判断一个数组是否包含NaN,可以使用数组的indexOf()函数来实现。
var arr = [1, 2, NaN, 4];
console.log(arr.indexOf(NaN) !== -1); // true
3.4 判断一个数字是否为NaN
虽然isNaN()可以判断是否为NaN,但是如果传入的是一个非数字的字符串,也会返回true,这在某些情况下可能不是我们想要的结果。可以通过Object.is()函数来判断一个数字是否为NaN。
function isNotANumber(value) {
return typeof value === 'number' && Object.is(value, NaN);
}
console.log(isNotANumber(NaN)); // true
console.log(isNotANumber(123)); // false
console.log(isNotANumber("hello")); // false
4. 总结
NaN是一种特殊的数字类型,在数学运算时不合法导致的。判断NaN时不能使用==运算符,可以使用isNaN()函数或Object.is()函数。NaN在实际开发中有很多应用场景,包括判断一个值是否为数字、将字符串转换为数字、判断数组是否包含NaN以及判断一个数字是否为NaN等。