数字

基线 广泛可用

此功能已得到良好建立,并且可在许多设备和浏览器版本中使用。它自以下时间起在浏览器中可用 2015 年 7 月.

Number 值表示浮点数,例如 37-9.25

Number 构造函数包含用于处理数字的常量和方法。可以使用 Number() 函数将其他类型的值转换为数字。

描述

数字最常以字面形式表示,例如 2553.14159词法语法 包含更详细的参考。

js
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

js
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 的幂。将其视为科学计数法

数字 = ( 1 ) 符号 ( 1 + 尾数 ) 2 指数 \text{Number} = ({-1})^{\text{sign}} \cdot (1 + \text{mantissa}) \cdot 2^{\text{exponent}}

尾数以 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_INTEGERNumber.MAX_SAFE_INTEGER 获取),因为尾数只能容纳 53 位(包括前导 1)。

有关此内容的更多详细信息,请参阅 ECMAScript 标准

数字强制转换

许多期望数字的内置操作首先将其参数强制转换为数字(这在很大程度上是 Number 对象的行为类似于数字原语的原因)。 此操作 可以概括如下

  • 数字按原样返回。
  • undefined 变为 NaN
  • null 变为 0
  • true 变为 1false 变为 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。

值得注意的是,当转换为整数时,undefinednull 都变成 0,因为 undefined 会转换为 NaN,而 NaN 也会变成 0

定长数字转换

JavaScript 有一些处理整数二进制编码的底层函数,最值得注意的是按位运算符TypedArray对象。按位运算符始终将操作数转换为 32 位整数。在这些情况下,在将值转换为数字后,数字将通过首先截断小数部分,然后取整数的二进制补码编码中的最低位来规范化为给定的宽度。

js
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 对象的属性为几个数值变量赋值

js
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 对象的最小和最大整数值。

js
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对象转换为数值

js
const d = new Date("1995-12-17T03:24:00");
console.log(Number(d));

这将输出 819199440000

将数字字符串和 null 转换为数字

js
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 表格仅在浏览器中加载

另请参阅