Number.prototype.toString()

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

Number 值的 toString() 方法返回一个表示此数字值的字符串。

试一试

function hexColor(c) {
  if (c < 256) {
    return Math.abs(c).toString(16);
  }
  return 0;
}

console.log(hexColor(233));
// Expected output: "e9"

console.log(hexColor("11"));
// Expected output: "b"

语法

js
toString()
toString(radix)

参数

radix 可选

一个介于 236 之间的整数,指定用于表示数字值的基数。默认为 10。

返回值

一个表示指定数字值的字符串。如果基数是 10 且数字的绝对值大于或等于 1021 或小于 10-6,则使用科学计数法。

异常

RangeError

如果 radix 小于 2 或大于 36,则抛出该错误。

TypeError

如果此方法在非 Number 对象上调用,则抛出该错误。

描述

Number 对象重写了 ObjecttoString 方法;它不继承 Object.prototype.toString()。对于 Number 值,toString 方法返回指定基数下的值的字符串表示。

对于大于 10 的基数,字母用于表示大于 9 的数字。例如,对于十六进制数(基数 16),使用 af

如果指定的数字值为负数,则保留符号。即使基数为 2,情况也是如此;返回的字符串是数字值的正二进制表示,前面带有 - 符号,而不是数字值的二进制补码。

0-0 的字符串表示形式都是 "0"Infinity 返回 "Infinity"NaN 返回 "NaN"

如果数字不是整数,则使用小数点 . 分隔小数部分。如果基数是 10 且数字的绝对值大于或等于 1021 或小于 10-6,则使用科学计数法。在这种情况下,返回的字符串始终明确指定指数的符号。

js
console.log((10 ** 21.5).toString()); // "3.1622776601683794e+21"
console.log((10 ** 21.5).toString(8)); // "526665530627250154000000"

浮点数的底层表示是基数为 2 的科学计数法(参见数字编码)。然而,toString() 方法并不直接使用此数字值的最精确表示。相反,该算法使用区分输出与相邻数值所需的最小有效数字位数。例如,如果数字很大,对于同一个浮点数将有许多等效的字符串表示,而 toString() 将选择右边有最多 0 的那个(对于任何给定的基数)。

js
console.log((1000000000000000128).toString()); // "1000000000000000100"
console.log(1000000000000000100 === 1000000000000000128); // true

另一方面,Number.prototype.toFixed()Number.prototype.toPrecision() 允许您指定精度,并且可能比 toString() 更精确。

toString() 方法要求其 this 值是一个 Number 原始值或包装器对象。对于其他 this 值,它会抛出 TypeError,而不会尝试将其强制转换为数字值。

由于 Number 没有 [Symbol.toPrimitive]() 方法,当 Number 对象用于需要字符串的上下文(例如在模板字面量中)时,JavaScript 会自动调用 toString() 方法。然而,Number 原始值在被强制转换为字符串时,不会查找 toString() 方法——而是直接使用与初始 toString() 实现相同的算法进行转换。

js
Number.prototype.toString = () => "Overridden";
console.log(`${1}`); // "1"
console.log(`${new Number(1)}`); // "Overridden"

示例

使用 toString()

js
const count = 10;
console.log(count.toString()); // "10"

console.log((17).toString()); // "17"
console.log((17.2).toString()); // "17.2"

const x = 6;
console.log(x.toString(2)); // "110"
console.log((254).toString(16)); // "fe"
console.log((-10).toString(2)); // "-1010"
console.log((-0xff).toString(2)); // "-11111111"

转换数字字符串的基数

如果您有一个表示非十进制基数数字的字符串,可以使用 parseInt()toString() 将其转换为不同的基数。

js
const hex = "CAFEBABE";
const bin = parseInt(hex, 16).toString(2); // "11001010111111101011101010111110"

请注意精度损失:如果原始数字字符串过大(例如,大于 Number.MAX_SAFE_INTEGER),则应改用 BigInt。但是,BigInt 构造函数仅支持表示数字字面量的字符串(即,以 0b0o0x 开头的字符串)。如果您的原始基数不是二进制、八进制、十进制或十六进制之一,您可能需要手动编写基数转换器,或使用库。

规范

规范
ECMAScript® 2026 语言规范
# sec-number.prototype.tostring

浏览器兼容性

另见