JavaScript中的NaN

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等。