Skip to content

ES6 - Number 对象

在 JavaScript 中,数字主要是原始值(primitive values)。然而,JavaScript 也提供了一个 Number 对象,它是原始数字值的包装器(wrapper)。通常您不需要直接创建 Number 对象,因为当对其调用方法时,JavaScript 会自动将数字字面量转换为 Number 实例。

const numObj = new Number(value);

如果 value 无法转换为数字,Number 对象将表示 NaN(非数字,Not-a-Number)。通常最好使用数字原始值进行操作。

这些属性直接通过 Number 构造函数访问(例如 Number.MAX_VALUE)。

属性描述
Number.EPSILON两个可表示数字之间的最小差异。用于浮点数比较。
Number.MAX_SAFE_INTEGERJavaScript 中最大的安全整数(253 - 1)。超出此范围的操作可能会丢失精度。
Number.MIN_SAFE_INTEGERJavaScript 中最小的安全整数(-(253 - 1))。
Number.MAX_VALUE可表示的最大正数。
Number.MIN_VALUE可表示的最小正数(最接近零,但不为零)。
Number.NaN表示“非数字”(Not-a-Number),是一个特殊值,表示不可表示或未定义的数值结果。
Number.NEGATIVE_INFINITY表示负无穷的特殊值(例如,负数除以零的结果)。
Number.POSITIVE_INFINITY表示正无穷的特殊值(例如,正数除以零的结果)。
Number.prototype一个对象,允许您向所有 Number 实例添加属性和方法。(高级用法)。

这些方法直接在 Number 构造函数上调用。

方法描述
Number.isNaN(value)确定传递的值是否为 NaN。比全局 isNaN() 函数更健壮,因为它不会将参数强制转换为数字。
Number.isFinite(value)确定传递的值是否为有限数(非 NaN,Infinity 或 -Infinity)。
Number.isInteger(value)确定传递的值是否为整数。
Number.isSafeInteger(value)确定传递的值是否为安全整数(即在 Number.MIN_SAFE_INTEGER 到 Number.MAX_SAFE_INTEGER 的范围内)。
Number.parseFloat(string)解析字符串参数并返回浮点数。与全局 parseFloat() 相同。
Number.parseInt(string, radix)解析字符串参数并返回指定基数(radix/base)的整数。与全局 parseInt() 相同。
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN('hello' / 2)); // true
console.log(Number.isFinite(123)); // true
console.log(Number.isFinite(Infinity)); // false
console.log(Number.isInteger(10)); // true
console.log(Number.isInteger(10.5)); // false
console.log(Number.isSafeInteger(Math.pow(2, 53) - 1)); // true
console.log(Number.isSafeInteger(Math.pow(2, 53))); // false

这些方法在数字原始值或 Number 对象上调用。

方法描述
num.toExponential(fractionDigits)返回以指数表示法表示数字的字符串。
num.toFixed(digits)返回以定点表示法表示数字的字符串(小数点后指定位数)。
num.toLocaleString(locales, options)返回表示数字的语言敏感字符串。
num.toPrecision(precision)返回表示具有指定精度(有效位数)的数字字符串。
num.toString(radix)返回指定基数(radix/base,例如二进制为 2,十六进制为 16)表示数字的字符串。默认为基数 10。
num.valueOf()返回 Number 对象的原始值。
const n = 12345.6789;
console.log(n.toExponential(2)); // "1.23e+4"
console.log(n.toFixed(2)); // "12345.68"
console.log(n.toPrecision(7)); // "12345.68"
console.log((255).toString(16)); // "ff" (十六进制)
console.log((10).toString(2)); // "1010" (二进制)

ES6 引入了方便的二进制和八进制整数字面量语法。十六进制字面量之前已经可用。

  • 二进制字面量(Binary Literals):以 0b 或 0B 开头。示例:0b1010(十进制 10)。
  • 八进制字面量(Octal Literals):以 0o 或 0O 开头。示例:0o12(十进制 10)。(注意:以单独的 0 开头的旧式八进制字面量在严格模式下已弃用,应避免使用)。
  • 十六进制字面量(Hexadecimal Literals):以 0x 或 0X 开头。示例:0xA(十进制 10)。
console.log(0b001); // 1
console.log(0b010); // 2
console.log(0b1111); // 15
console.log(0o010); // 8
console.log(0o100); // 64
console.log(0xFF); // 255 (F 在十六进制中是 15, FF = 15*16 + 15)
console.log(0x100); // 256 (1*16^2 + 0*16^1 + 0*16^0)

对于大于 Number.MAX_SAFE_INTEGER 或小于 Number.MIN_SAFE_INTEGER 的数字,JavaScript 引入了 BigInt 类型。BigInt 可以通过在整数文字末尾添加 n 或调用 BigInt() 构造函数来创建。

const largeNumber = 9007199254740991n; // 一个 BigInt
const anotherLarge = BigInt("9007199254740992");
console.log(largeNumber + 1n); // 9007199254740992n
// 注意:您不能直接在标准算术运算中混合 Number 和 BigInt 类型。
// console.log(largeNumber + 1); // 这将抛出一个 TypeError

BigInt 允许任意精度整数算术。更多详细信息,请参阅 MDN BigInt 文档。