数字
Number
值表示浮点数,例如 37
或 -9.25
。
Number
构造函数包含用于处理数字的常量和方法。可以使用 Number()
函数将其他类型的值转换为数字。
描述
数字最常以字面形式表示,例如 255
或 3.14159
。 词法语法 包含更详细的参考。
255; // two-hundred and fifty-five
255.0; // same number
255 === 255.0; // true
255 === 0xff; // true (hexadecimal notation)
255 === 0b11111111; // true (binary notation)
255 === 0.255e3; // true (decimal exponential notation)
JavaScript 代码中的数字字面量(如 37
)是浮点值,而不是整数。在日常使用中没有单独的整数类型。(JavaScript 还有一个 BigInt
类型,但它并非旨在替代日常使用的 Number。37
仍然是一个数字,而不是 BigInt。)
当用作函数时,Number(value)
将字符串或其他值转换为 Number 类型。如果值无法转换,则返回 NaN
。
Number("123"); // returns the number 123
Number("123") === 123; // true
Number("unicorn"); // NaN
Number(undefined); // NaN
数字编码
JavaScript Number
类型是 双精度 64 位二进制格式 IEEE 754 值,类似于 Java 或 C# 中的 double
。这意味着它可以表示小数,但存储的数字的大小和精度存在一些限制。简单来说,IEEE 754 双精度数使用 64 位表示 3 个部分
- 1 位用于符号(正或负)
- 11 位用于指数(-1022 到 1023)
- 52 位用于尾数(表示 0 到 1 之间的数字)
尾数(也称为有效数字)是表示实际值(有效数字)的数字部分。指数是尾数应乘以的 2 的幂。将其视为科学计数法
尾数以 52 位存储,在二进制小数中解释为 1.…
之后的数字。因此,尾数的精度为 2-52(可通过 Number.EPSILON
获取),或大约 15 到 17 位十进制;高于此精度级别的算术运算会受到 舍入 的影响。
数字可以容纳的最大值为 21023 × (2 - 2-52)(指数为 1023,尾数为 2 进制中的 0.1111…),可通过 Number.MAX_VALUE
获取。高于此值的值将替换为特殊数字常量 Infinity
。
整数只能在 -253 + 1 到 253 - 1(含)的范围内无损地表示(可通过 Number.MIN_SAFE_INTEGER
和 Number.MAX_SAFE_INTEGER
获取),因为尾数只能容纳 53 位(包括前导 1)。
有关此内容的更多详细信息,请参阅 ECMAScript 标准。
数字强制转换
许多期望数字的内置操作首先将其参数强制转换为数字(这在很大程度上是 Number
对象的行为类似于数字原语的原因)。 此操作 可以概括如下
- 数字按原样返回。
undefined
变为NaN
。null
变为0
。true
变为1
;false
变为0
。- 字符串通过将其解析为包含 数字字面量 的方式进行转换。解析失败将导致
NaN
。与实际的数字字面量相比,有一些细微的差异- 开头和结尾的空格/换行符将被忽略。
- 前导
0
数字不会导致数字变为八进制字面量(或在严格模式下被拒绝)。 +
和-
允许出现在字符串的开头以指示其符号。(在实际代码中,它们“看起来像”字面量的一部分,但实际上是单独的一元运算符。)但是,符号只能出现一次,并且后面不能跟空格。Infinity
和-Infinity
被识别为字面量。在实际代码中,它们是全局变量。- 空字符串或仅包含空格的字符串将转换为
0
。 - 数字分隔符 不允许。
- BigInt 会抛出
TypeError
以防止意外的隐式强制转换导致精度丢失。 - 符号 会抛出
TypeError
。 - 对象首先 转换为原语,方法是按顺序调用其
[Symbol.toPrimitive]()
(以"number"
作为提示)、valueOf()
和toString()
方法。然后将生成的原语转换为数字。
在 JavaScript 中有两种方法可以实现几乎相同的效果。
- 一元加号:
+x
完全执行上面解释的数字强制转换步骤以转换x
。 Number()
函数:Number(x)
使用相同的算法转换x
,除了 BigInt 不会抛出TypeError
,而是返回其数字值,并可能丢失精度。
Number.parseFloat()
和 Number.parseInt()
类似于 Number()
,但仅转换字符串,并且具有略微不同的解析规则。例如,parseInt()
无法识别小数点,而 parseFloat()
无法识别 0x
前缀。
整数转换
某些操作需要整数,最值得注意的是那些处理数组/字符串索引、日期/时间组件和数字基数的操作。在执行上述数字强制转换步骤后,结果将 截断 为整数(通过丢弃小数部分)。如果数字为 ±Infinity,则按原样返回。如果数字为 NaN
或 -0
,则返回 0
。因此,结果始终为整数(不为 -0
)或 ±Infinity。
值得注意的是,当转换为整数时,undefined
和 null
都变成 0
,因为 undefined
会转换为 NaN
,而 NaN
也会变成 0
。
定长数字转换
JavaScript 有一些处理整数二进制编码的底层函数,最值得注意的是按位运算符和TypedArray
对象。按位运算符始终将操作数转换为 32 位整数。在这些情况下,在将值转换为数字后,数字将通过首先截断小数部分,然后取整数的二进制补码编码中的最低位来规范化为给定的宽度。
new Int32Array([1.1, 1.9, -1.1, -1.9]); // Int32Array(4) [ 1, 1, -1, -1 ]
new Int8Array([257, -257]); // Int8Array(2) [ 1, -1 ]
// 257 = 0001 0000 0001
// = 0000 0001 (mod 2^8)
// = 1
// -257 = 1110 1111 1111
// = 1111 1111 (mod 2^8)
// = -1 (as signed integer)
new Uint8Array([257, -257]); // Uint8Array(2) [ 1, 255 ]
// -257 = 1110 1111 1111
// = 1111 1111 (mod 2^8)
// = 255 (as unsigned integer)
构造函数
Number()
-
创建
Number
对象。当作为函数调用时,它返回 Number 类型的原始值。
静态属性
Number.EPSILON
-
两个可表示数字之间的最小间隔。
Number.MAX_SAFE_INTEGER
-
JavaScript 中的最大安全整数 (253 - 1)。
Number.MAX_VALUE
-
最大的正可表示数。
Number.MIN_SAFE_INTEGER
-
JavaScript 中的最小安全整数 (-(253 - 1))。
Number.MIN_VALUE
-
最小的正可表示数——即最接近零的正数(但实际上不为零)。
Number.NaN
-
特殊的“Not a Number”值。
Number.NEGATIVE_INFINITY
-
表示负无穷大的特殊值。溢出时返回。
Number.POSITIVE_INFINITY
-
表示无穷大的特殊值。溢出时返回。
静态方法
Number.isFinite()
-
确定传递的值是否为有限数字。
Number.isInteger()
-
确定传递的值是否为整数。
Number.isNaN()
-
确定传递的值是否为
NaN
。 Number.isSafeInteger()
-
确定传递的值是否为安全整数(介于 -(253 - 1) 和 253 - 1 之间的数字)。
Number.parseFloat()
-
这与全局的
parseFloat()
函数相同。 Number.parseInt()
-
这与全局的
parseInt()
函数相同。
实例属性
这些属性定义在 Number.prototype
上,并由所有 Number
实例共享。
Number.prototype.constructor
-
创建实例对象的构造函数。对于
Number
实例,初始值为Number
构造函数。
实例方法
Number.prototype.toExponential()
-
返回以指数表示法表示数字的字符串。
Number.prototype.toFixed()
-
返回以定点表示法表示数字的字符串。
Number.prototype.toLocaleString()
-
返回一个包含此数字的语言敏感表示形式的字符串。覆盖了
Object.prototype.toLocaleString()
方法。 Number.prototype.toPrecision()
-
返回一个字符串,表示以定点或指数表示法表示的指定精度的数字。
Number.prototype.toString()
-
返回一个字符串,表示以指定的基数(“基数”)表示的指定对象。覆盖了
Object.prototype.toString()
方法。 Number.prototype.valueOf()
-
返回指定对象的原始值。覆盖了
Object.prototype.valueOf()
方法。
示例
使用 Number 对象为数值变量赋值
以下示例使用 Number
对象的属性为几个数值变量赋值
const biggestNum = Number.MAX_VALUE;
const smallestNum = Number.MIN_VALUE;
const infiniteNum = Number.POSITIVE_INFINITY;
const negInfiniteNum = Number.NEGATIVE_INFINITY;
const notANum = Number.NaN;
Number 的整数范围
以下示例显示了可以表示为 Number
对象的最小和最大整数值。
const biggestInt = Number.MAX_SAFE_INTEGER; // (2**53 - 1) => 9007199254740991
const smallestInt = Number.MIN_SAFE_INTEGER; // -(2**53 - 1) => -9007199254740991
当解析已序列化为 JSON 的数据时,超出此范围的整数值在 JSON 解析器将其强制转换为 Number
类型时可能会损坏。
一种可能的解决方法是使用String
代替。
可以使用BigInt
类型表示更大的数字。
使用 Number() 转换 Date 对象
以下示例使用 Number
作为函数将Date
对象转换为数值
const d = new Date("1995-12-17T03:24:00");
console.log(Number(d));
这将输出 819199440000
。
将数字字符串和 null 转换为数字
Number("123"); // 123
Number("123") === 123; // true
Number("12.3"); // 12.3
Number("12.00"); // 12
Number("123e-1"); // 12.3
Number(""); // 0
Number(null); // 0
Number("0x11"); // 17
Number("0b11"); // 3
Number("0o11"); // 9
Number("foo"); // NaN
Number("100a"); // NaN
Number("-Infinity"); // -Infinity
规范
规范 |
---|
ECMAScript 语言规范 # sec-number-objects |
浏览器兼容性
BCD 表格仅在浏览器中加载