数字
数字(Number
)类型的值即数字值。在 JavaScript 中写成如下形式:
13
在程序中使用这个值的时候,就会将数字 13 以位序列的方式存放在计算机的内存当中。
JavaScript使用固定数量的位(64 位)来存储单个数字值。 你可以用 64 位创造很多模式,这意味着可以表示的不同数值是有限的。 对于N
个十进制数字,可以表示的数值数量是10^N
。 与之类似,给定 64 个二进制数字,你可以表示2^64
个不同的数字,大约 18 亿亿(18 后面有 18 个零)。太多了。
过去计算机内存很小,人们倾向于使用一组 8 位或 16 位来表示他们的数字。 这么小的数字很容易意外地溢出,最终得到的数字不能放在给定的位数中。 今天,即使是装在口袋里的电脑也有足够的内存,所以你可以自由使用 64 位的块,只有在处理真正的天文数字时才需要担心溢出。
不过,并非所有 18 亿亿以下的整数都能放在 JavaScript 数值中。 这些位也存储负数,所以一位用于表示数字的符号。 一个更大的问题是,也必须表示非整数。 为此,一些位用于存储小数点的位置。 可以存储的实际最大整数更多地在 9 亿亿(15 个零)的范围内 - 这仍然相当多。
使用小数点来表示分数。
9.81
对于非常大或非常小的数字,你也可以通过输入e
(表示指数),后面跟着指数来使用科学记数法:
2.998e8
即2.998 * 10^8 = 299,800,000
。
当计算小于前文当中提到的 9000 万亿的整数时,其计算结果会十分精确,不过在计算小数的时候精度却不高。正如(pi
)无法使用有限个数的十进制数字表示一样,在使用 64 位来存储分数时也同样会丢失一些精度。虽说如此,但这类丢失精度只会在一些特殊情况下才会出现问题。因此我们需要注意在处理分数时,将其视为近似值,而非精确值。
算术
与数字密切相关的就是算术。比如,加法或者乘法之类的算术运算会使用两个数值,并产生一个新的数字。JavaScript 中的算术运算如下所示:
100 + 4 * 11
我们把+
和*
符号称为运算符。第一个符号表示加法,第二个符号表示乘法。将一个运算符放在两个值之间,该运算符将会使用其旁边的两个值产生一个新值。
但是这个例子的意思是“将 4 和 100 相加,并将结果乘 11”,还是是在加法之前计算乘法? 正如你可能猜到的那样,乘法首先计算。 但是和数学一样,你可以通过将加法包在圆括号中来改变它:
(100 + 4) * 11
–
运算符表示减法,/
运算符则表示除法。
在运算符同时出现,并且没有括号的情况下,其运算顺序根据运算符优先级确定。示例中的乘法运算符优先级高于加法。而/
运算符和*
运算符优先级相同,+
运算符和–
运算符优先级也相同。当多个具有相同优先级的运算符相邻出现时,运算从左向右执行,比如1–2+1
的运算顺序是(1–2)+1
。
你无需担心这些运算符的优先级规则,不确定的时候只需要添加括号即可。
还有一个算术运算符,你可能无法立即认出。 %
符号用于表示取余操作。 X % Y
是Y
除X
的余数。 例如,314 % 100
产生14
,144 % 12
产生0
。 余数的优先级与乘法和除法的优先级相同。 你还经常会看到这个运算符被称为模运算符。
特殊数字
在 JavaScript 中有三个特殊的值,它们虽然是数字,但看起来却跟一般的数字不太一样。
前两个是Infinity
和-Infinity
,它们代表正无穷和负无穷。 “无穷减一”仍然是“无穷”,依此类推。 尽管如此,不要过分信任基于无穷大的计算。 它在数学上不合理,并且很快导致我们的下一个特殊数字:NaN
。
NaN
代表“不是数字”,即使它是数字类型的值。 例如,当你尝试计算0/0
(零除零),Infinity - Infinity
或任何其他数字操作,它不会产生有意义的结果时,你将得到此结果。