Numbers 表格

数字值由任意系列的数字字符组成,例如:

5

数字数据类型还包含一些表示数字概念的特殊全局属性,例如 InfinityNaN,这两个值表示“非数字”,表示尝试对非数字值进行数学计算时可能会产生结果。

数字对象

将一个值传递给 Number() 函数时,该值将转换为等值的数字。例如,数字字符串会生成等效的数字基元:

Number( "10" );
> 10

falsenull 值传递给 Number() 会返回 0,而 true 会返回 1

Number( null );
> 0

Number( false );
> 0

Number( true );
> 1`

如果无法转换某个值(如 undefined 或包含非数字字符的字符串),则 Number 函数会返回 NaN

Number( undefined );
> NaN

Number( "The number 3." );
> NaN

原型继承中所述,您可能几乎没有理由将 Number 对象用作构造函数,因为它会创建一个 Number 对象,而不是数字字面量。

let numObject = new Number( 15 );

numObject;
> Number { 15 }

此对象表现为数学运算的指定值,但无法与数字字面量进行严格的相等比较,因为数据类型不匹配,没有相对于字面量值提供任何实际优势。

let tenObject = new Number( 10 );

tenObject + 5;
> 15

tenObject === 10;
> false

浮点数和整数

JavaScript 只有一个数字类型:介于 -2^10242^1024 之间的 64 位 IEEE 754-1985 双精度浮点数。JavaScript 在内存中存储任何数字之前,会先将该数字转换为二进制浮点数(也称为“浮点数”)。float

这种 64 位存储(一个正数或负“符号”位,11 位用于指数,52 位用于分数)可能会导致精度错误,且任意数位都不在允许范围内。这一限制是 JavaScript 数字数据类型的固有限制。

0.1 + 0.7
> 0.7999999999999999

数字值可以存储为“整数”,即 -(2^53 − 1)2^53 − 1 之间不含小数的浮点数。由于浮点数和整数的存储方式相同,因此这些数字的运算方式没有实际区别。不过,我们建议您尽可能使用整数,以避免精度错误。

数字运算符

当您将标准数学运算符与数字基元一起使用时,应遵循数学运算顺序:先对括号中的所有表达式求值,然后计算指数、乘法、除法、加减法和减法运算。

运算符 名称 说明 用法 结果
+ 加法 2+2 4
- 减法 4-2 2
* 2*5 10
/ 部门 10/5 2
++ 递增 对数值加 1 2++ 3
-- 减少 从数值中减去 1 3-- 2
** 指数 返回第一个
运算数的第二个运算数次幂的结果。
2**4 16
% 其余 返回
第一个运算数除以第二个运算数后剩余的余数。
12%5 2

您还可以使用数学赋值运算符对变量的值执行数学运算,并立即将新计算的值赋值给变量。

运算符 名称 用法
+= 添加操作分配 myValue += 2
-= 减法分配 myValue -= 2
*= 乘法赋值 myValue *= 2
/= 部门分配 myValue /= 2
**= 指数赋值 myValue **= 2
%= 其余分配 myValue %= 2

符号值

数字基元也适用于几种特殊情况:“非数字”值 (NaN) 和表示无穷大的值,该值可以是正数 (Infinity),也可以是负数 (-Infinity)。

您很少遇到 Infinity,因为除以 0 的结果(在这种情况下,大多数编程语言会抛出错误):

10 / 0
> Infinity

请注意,JavaScript 区分大小写。Infinity 是表示无穷大概念的数字数据类型,但 infinity 没有特殊含义:

Infinity
> Infinity

infinity
> Uncaught ReferenceError: infinity is not defined

当算术运算的结果无法用数字表示时,NaN(意为“非数字”)会更频繁地显示。例如,由于 JavaScript 会尝试根据值和上下文推断数据类型,因此可以在数学运算中使用仅包含数字的字符串字面量:

"2" * 2;
> 4

但是,如果该字符串无法解析为数字值,则数学运算的结果为非数字:

"two" * 2;
> NaN

如果在数学运算中用数字表示无效值,就会返回 NaN。示例如下:

  • 数字转换失败(例如 parseInt( undefined )
  • 结果不是实数的算术运算(例如,0 / 0Math.sqrt( -10 )
  • 结果不确定的算术运算 (0 * Infinity)
  • 包含显式 NaN (NaN + 2) 或 NaN 结果 (2 * "string" / 2) 的算术运算

检查您的掌握程度

false 传递给 Number() 的结果是什么?

0
False
NaN
1

以下数学运算的结果是什么?

"Six" * 3

NaN
2
18
True
0