首页 >web前端 >js教程 >JavaScript号码的乐趣

JavaScript号码的乐趣

Lisa Kudrow
Lisa Kudrow原创
2025-02-24 10:17:10445浏览

Fun with JavaScript Numbers

关键要点

  • JavaScript 中所有数字都使用 Number 数据类型表示,包括整数、实数、十六进制数和科学计数法表示的数字。但是,JavaScript 在内部将所有数字表示为 IEEE 754 浮点数,这意味着 JavaScript 数学运算并非 100% 精确。
  • JavaScript 定义了一个名为 Not-a-Number (NaN) 的数字,用于将非数字表示为数字。NaN 是 JavaScript 中唯一一个不等于自身的数值,可以使用 isNaN() 函数进行测试。
  • JavaScript 有一些特性,例如带符号的零,导致出现正零 ( 0) 和负零 (-0),它们被认为是不同的值,但 JavaScript 的比较运算符无法区分它们。在 JavaScript 中,除以零会产生 Infinity,而除以负零会产生 -Infinity。

数据类型是每种编程语言的重要组成部分,而数字也许是最重要的数据类型。毕竟,计算机实际上只是昂贵的计算器。像任何有价值的编程语言一样,JavaScript 支持数值数据。但是,与 JavaScript 的许多其他方面一样,数字也有一些细微之处,如果您不小心,可能会给您带来麻烦。本文探讨了数值数据及其一些特性。注意:在阅读本文之前,您应该对 JavaScript 数据类型有基本的了解

Number 类型

在 JavaScript 中,所有数字都使用 Number 数据类型表示。这包括整数、实数、十六进制数和科学计数法表示的数字。以下示例通过将 typeof 运算符应用于各种数字来验证这一点。此示例中 typeof 的每次应用都返回 number。

<code class="language-javascript">typeof(100);
typeof(3.14);
typeof(0xDEADBEEF);
typeof(7.89e2);</code>

在前面的示例中,数字采用了各种格式。但是,在内部,所有 JavaScript 数字实际上都表示为 IEEE 754 浮点数。这很重要,因为它意味着 JavaScript 没有整数的概念,尽管该语言有 parseInt() 函数。这也意味着 JavaScript 数学运算并非 100% 精确。例如,考虑以下表达式。

<code class="language-javascript">(0.1 + 0.2) === 0.3</code>

如果您不熟悉浮点数,您肯定期望此表达式计算结果为 true。毕竟,0.1 0.2 等于 0.3。但是,由于浮点数的工作方式,其和实际上是 0.30000000000000004。差异很小,但这足以导致整个表达式的计算结果为 false。

正零和负零

IEEE 754 标准的另一个特性是带符号的零。这导致出现两个零——正零, 0,和负零,-0。这可能看起来很奇怪,但乐趣才刚刚开始。显然,这两个是不同的值,否则就只有一个零了。但是,如果您显示这两个零中的任何一个,符号都会被删除。例如,以下代码尝试并排显示这两个零值。

<code class="language-javascript">typeof(100);
typeof(3.14);
typeof(0xDEADBEEF);
typeof(7.89e2);</code>

更糟糕的是,JavaScript 的比较运算符似乎也无法区分这两个值,如下例所示。

<code class="language-javascript">(0.1 + 0.2) === 0.3</code>

这个问题有一个相当简单的解决方法。在 JavaScript 中,除以零会产生 Infinity。同样,除以负零会产生 -Infinity。因此,要确定一个数字是否等于 -0,我们必须检查它是否为零,然后使用它作为分母进行除法,并检查 -Infinity,如下所示。

<code class="language-javascript">alert((+0) + " " + (-0));
// 显示 0 0</code>

Not-a-Number (NaN)

JavaScript 实际上定义了一个名为 Not-a-Number (NaN) 的数字。NaN 是一个虚假的值,用于将非数字表示为数字。这个值很有趣,因为它的名称本身就排除了它是数字的可能性,但是 typeof(NaN) 是 number。NaN 也很有趣,因为它是在 JavaScript 中唯一一个不等于自身的数值。例如,以下代码将返回 false。

<code class="language-javascript">alert((+0 === -0));
// 显示 true
alert((-0 === +0)); // 显示 true</code>

您可以使用 isNaN() 函数测试 NaN,而不是使用比较运算符,如下所示。

<code class="language-javascript">function isNegativeZero(x) {
  return (x === 0 && (1/x) === -Infinity);
}</code>

但是,isNaN() 也很有趣,因为它可能会产生误导。如果您传入一个可以强制转换为数字的值,isNaN() 将返回 false。在以下示例中,isNaN() 使用几个明显不是数字的值进行调用。但是,每次调用都返回 false。

<code class="language-javascript">alert((NaN === NaN));
// 显示 false</code>

检查 NaN 的更好方法是利用它不等于自身这一事实。以下函数使用严格不等式测试 NaN。此函数仅对值 NaN 返回 true。

<code class="language-javascript">isNaN(1);
// 返回 false
isNaN(NaN);
// 返回 true</code>

其他有趣的时刻

还有一些其他情况可能会导致数字出现问题。首先,您应该注意旧的浏览器,它们允许将 Infinity、NaN 和 undefined 等全局属性重新定义为新值。例如,如果经常使用 NaN,以下代码可能会产生很多问题。幸运的是,现代浏览器会忽略对前面提到的属性的赋值。严格模式更进一步,将这些静默故障转换为错误。

<code class="language-javascript">isNaN(true);
isNaN(false);
isNaN("");
isNaN(null);
// 全部返回 false</code>

另一个有趣的诊断错误来自添加数字和字符串。如下所示是一个示例。在这种情况下,字符串连接会覆盖加法。这会导致 foo 被转换为字符串“100”。最终结果是字符串“1001”,这与预期的值 101 大相径庭。这种类型的错误比您想象的更常见,并且往往在读取用户输入时发生。

<code class="language-javascript">function isNotANumber(x) {
  return x !== x;
}</code>

结论

本文探讨了 JavaScript 中数字的一些特性。希望您现在了解这些问题是如何产生的,以及如何避免它们。而且,尽管您可能不会经常遇到像负零这样的情况,但至少现在您已经做好了准备。

关于 JavaScript 数字的常见问题 (FAQ)

在 JavaScript 中,将数字除以零会发生什么?

在 JavaScript 中,当您将数字除以零时,结果是 Infinity。这是因为任何数字除以零在数学上都是未定义的,但 JavaScript 出于实际目的将其表示为 Infinity。但是,如果您将零除以零,则结果为 NaN (Not a Number),因为此运算在数学中是不确定的。

JavaScript 如何处理 BigInt 除以零?

BigInt 是 JavaScript 中的一个内置对象,它提供了一种表示大于 2^53-1 的整数的方法,这是 JavaScript 可以使用 Number 原语可靠地表示的最大数字。如果您尝试将 BigInt 除以零,JavaScript 将抛出 RangeError,指示该操作无效。

如何在 JavaScript 中防止或处理除以零错误?

您可以在 JavaScript 中使用条件语句在执行除法运算之前检查分母是否为零来防止或处理除以零错误。如果分母为零,您可以决定如何处理它,例如,返回特定值或显示错误消息。

为什么 JavaScript 中 0 除以 0 为 NaN?

在数学中,表达式 0/0 是未定义的,因为它没有明确的、确定的值。在 JavaScript 中,未定义的数学运算会导致 NaN (Not a Number)。因此,当您在 JavaScript 中将零除以零时,结果为 NaN。

JavaScript 中 NaN 和 Infinity 有什么区别?

在 JavaScript 中,NaN (Not a Number) 和 Infinity 是特殊的数值。NaN 表示不是合法数字的值,通常是由于未定义或不确定的数学运算造成的。另一方面,Infinity 表示大于任何可能数字的数字,通常是由于将数字除以零造成的。

如何检查 JavaScript 中的结果是否为 NaN?

您可以使用 JavaScript 中的 isNaN() 函数来检查结果是否为 NaN。如果参数为 NaN,此函数返回 true,否则返回 false。

如何检查 JavaScript 中的结果是否为 Infinity?

您可以使用 JavaScript 中的 isFinite() 函数来检查结果是否为有限数字。如果参数为正无穷大或负无穷大,此函数返回 false,否则返回 true。

JavaScript 中 Number 原语有什么意义?

JavaScript 中的 Number 原语用于表示数值。它可以表示整数值以及浮点数。但是,它只能可靠地表示最多 2^53-1 的数字。

如何在 JavaScript 中处理大数字?

为了处理超过 JavaScript 安全整数限制的大数字,您可以使用 BigInt 对象。BigInt 允许您表示大于 2^53-1 的整数。

JavaScript 中的 RangeError 是什么?

当值不在预期范围内时,JavaScript 会抛出 RangeError。例如,尝试将 BigInt 除以零会导致 RangeError。

以上是JavaScript号码的乐趣的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn