toString()用于数字转指定进制字符串,仅限Number调用且radix须为2–36;parseInt()用于字符串按指定进制解析为十进制数,radix应显式指定以防隐式推断错误。

JavaScript 中的 toString() 和 parseInt() 是处理进制转换最常用的两个方法,但它们的参数逻辑和适用场景容易混淆。关键在于:前者是**数字对象的方法**,用于将数字转为指定进制的字符串;后者是**全局函数**,用于将字符串按指定进制解析为十进制数字。
toString() 的 radix 参数必须是 2–36 的整数
toString() 只能被数字(Number)调用,不能用于字符串或 null/undefined。它的唯一可选参数是 radix(基数),代表目标进制:
- 不传参默认为 10(十进制),
(255).toString()→"255" - 传入 2~36 之间的整数才有效:
(255).toString(2)→"11111111",(255).toString(16)→"ff" - 超出范围(如 1、37 或小数)会抛出
RangeError;非数字类型(如字符串)调用会报错TypeError - 注意括号:必须写成
(123).toString(16)或123..toString(16),不能写123.toString(16)(语法错误,点号会被解析为小数点)
parseInt() 的 radix 决定解析规则,不传时有隐式推断
parseInt(string, radix) 第一个参数必须是字符串(非字符串会先被强制转为字符串),第二个参数 radix 指定按几进制解析该字符串:
- 显式传入 radix(推荐):
parseInt("1010", 2)→10,parseInt("ff", 16)→255 - radix 为 0 或省略时,会按“旧规则”自动判断:
• 以0x或0X开头 → 十六进制
• 以0开头(ES5 及更早)→ 八进制(已废弃,行为不一致,应避免)
• 其他 → 十进制 - radix 必须是 2–36 的整数,否则返回
NaN(不报错);parseInt("10", 1)或parseInt("10", 37)都返回NaN - 遇到非法字符立即停止解析:
parseInt("1010abc", 2)→10(只取前面有效的"1010")
常见误区与安全建议
进制转换看似简单,但实际开发中容易因参数缺失或类型误用导致意外结果:
立即学习“Java免费学习笔记(深入)”;
-
不要省略 parseInt 的 radix:尤其处理用户输入或动态数据时,
parseInt("08")在旧环境可能返回 0(八进制下 8 非法),现代环境虽默认十进制,但显式写parseInt("08", 10)更可靠 -
注意 toString 的调用主体:只有 Number 类型才有该方法;
"255".toString(16)是把字符串 "255" 转成十六进制字符串,结果仍是"255"(不是"ff"),因为字符串的toString()不接受 radix 参数 -
十六进制字母大小写无关:
parseInt("FF", 16)和parseInt("ff", 16)都返回 255;(255).toString(16)默认返回小写,如需大写可用.toUpperCase() -
二进制补零需求?toString 不直接支持:比如要固定 8 位二进制,需手动补零:
(5).toString(2).padStart(8, "0")→"00000101"
一句话总结核心区别
toString(radix) 是「数字 → 某进制字符串」,radix 必须合法且只能用于数字;parseInt(str, radix) 是「某进制字符串 → 十进制数字」,radix 应始终显式指定以确保可预测性。两者方向相反、类型要求不同、错误表现也不同——记清谁转谁、谁调用谁,就能避开大部分坑。










