解析 `NaN` 在 JS 引擎内部的‘位表示’:为什么它不等于它自己?

技术讲座:深入解析 JavaScript 中的 NaN 和它为何不等于它自己

引言

在 JavaScript 中,NaN(非数字)是一个特殊的值,用来表示不是一个数字的值。它是一个常见的值,几乎每个程序员都会在某个时刻遇到。然而,有一个令人困惑的特性是,NaN 不等于它自己。在本文中,我们将深入探讨 NaN 的位表示,以及为什么它不等于它自己。

什么是 NaN?

在 JavaScript 中,当你尝试将一个非数字的值转换为数字时,就会得到 NaN。例如:

console.log(Number('abc')); // NaN

在上面的代码中,'abc' 不能被转换为数字,因此 Number('abc') 的结果是 NaN

NaN 的位表示

在计算机内部,数字通常以二进制形式存储。对于浮点数,通常使用 IEEE 754 标准。然而,NaN 没有固定的位表示,因为它是用来表示无法表示的数字。

在 IEEE 754 标准中,非数字(NaN)的位表示是:

sign | exponent | mantissa
1    | all 1's  | all bits can be random

其中:

  • sign 位是 1,表示这是一个非数字。
  • exponent 位是全 1,表示指数部分是无穷大。
  • mantissa 位可以是任意的,因为对于 NaN,没有有效的尾数。

由于 NaN 的位表示是随机的,这就导致了 NaN 不等于它自己。

为什么 NaN 不等于它自己?

由于 NaN 的位表示是随机的,任何两个 NaN 值的位表示都可能是不同的。因此,使用 ===== 运算符比较两个 NaN 值时,结果总是 false

console.log(NaN == NaN); // false
console.log(NaN === NaN); // false

如何检测 NaN?

由于 NaN 不等于它自己,我们需要使用其他方法来检测 NaN

使用 isNaN() 函数

isNaN() 函数可以检测一个值是否是 NaN

console.log(isNaN(NaN)); // true
console.log(isNaN(42)); // false

使用 Object.is() 函数

Object.is() 函数是 ES6 引入的一个新函数,它可以更准确地比较两个值。

console.log(Object.is(NaN, NaN)); // true

实战案例

下面是一些使用 PHP、Python、Shell 和 SQL 语言处理 NaN 的示例。

PHP

<?php
$nan = NAN;
echo var_dump($nan == $nan); // bool(false)
?>

Python

nan = float('nan')
print(nan == nan) # False

Shell

nan=nan
echo "$nan == $nan" # false

SQL

-- PostgreSQL
SELECT NaN = NaN; -- false

总结

NaN 是 JavaScript 中一个特殊的值,用来表示不是一个数字的值。由于 NaN 的位表示是随机的,任何两个 NaN 值的位表示都可能是不同的,因此 NaN 不等于它自己。在处理 NaN 时,我们需要使用 isNaN() 函数或 Object.is() 函数来检测它。

希望本文能够帮助你更好地理解 JavaScript 中的 NaN。如果你有任何疑问,请随时提出。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注