数字值由任何一系列数字字符组成,例如
5
数字数据类型还包括一些特殊的全局属性,它们代表数字概念,例如 Infinity
和 NaN
,后者表示“非数字”的值,是在尝试对非数字值执行数学计算时可能出现的结果。
数字对象
当值传递给 Number()
函数时,该值将转换为等效的数字。例如,数字字符串会生成等效的数字基元
Number( "10" );
> 10
将 false
或 null
值传递给 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^1024
和 2^1024
之间的 64 位 IEEE 754-1985 双精度浮点数。在 JavaScript 将任何数字存储到内存中之前,它首先将该数字转换为二进制浮点数,也称为浮点数。
这种 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 |
|
++ |
递增 | 将数字加一 | 2++ |
3 |
-- |
递减 | 从数字中减一 | 3-- |
2 |
** |
指数 | 返回第一个数的幂运算结果 操作数到第二个操作数的幂。 |
2**4 |
16 |
% |
余数 | 返回第一个数除以第二个数时 剩下的余数。 |
12%5 |
2 |
您还可以使用数学赋值运算符对变量的值执行数学运算,并将新计算的值立即赋给变量。
运算符 | 名称 | 用法 |
---|---|---|
+= |
加法赋值 | myValue += 2 |
-= |
减法赋值 | myValue -= 2 |
*= |
乘法赋值 | myValue *= 2 |
/= |
除法赋值 | myValue /= 2 |
**= |
指数赋值 | myValue **= 2 |
%= |
余数赋值 | myValue %= 2 |
符号值
数字基元也适用于一些特殊情况:“非数字”值 (NaN
) 和表示无穷大的值,它可以是正数 (Infinity
) 或负数 (-Infinity
)。
您可能很少遇到 Infinity
,它是除以零的结果,在这种情况下,大多数编程语言都会抛出错误
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 / 0
、Math.sqrt( -10 )
) - 结果不确定的算术运算 (
0 * Infinity
) - 包含显式
NaN
(NaN + 2
) 或NaN
结果 (2 * "string" / 2
) 的算术运算
检查您的理解情况
将 false
传递给 Number()
的结果是什么?
以下数学运算的结果是什么?
“Six” * 3