讲解

JavaScript 的类型转换分两种:显式转换是你主动调用的,隐式转换是引擎在背后偷偷做的。隐式转换最常出现在两个场景:+ 运算(只要一边是字符串,另一边就被拼成字符串)和宽松相等 ==。这就是 '1' + 2 得到 '12' 而 '1' - 2 得到 1 的原因——减号没有字符串语义,两边都被转成了数字。

显式转换用三个全局函数:Number()、String()、Boolean()。Number('3.14') 得 3.14,Number('abc') 得 NaN(Not a Number,转换失败的标记),Number('') 和 Number(null) 得 0,Number(undefined) 得 NaN。把字符串解析成整数还可以用 parseInt('42px') 得 42——它会从开头解析到第一个非数字字符,而 Number('42px') 是 NaN。Boolean() 的假值一共只有这几个:false、0、-0、0n、''、null、undefined、NaN,其余一切——包括空数组 [] 和空对象 {}——都是真值。

字符串转数字还有个小陷阱是进制:parseInt('10', 2) 得 2,第二个参数指定解析的进制。老代码里 parseInt('08') 在某些环境下的怪异行为就是省略进制参数导致的,现代环境虽然已修复,但写上第二个参数仍是好习惯。

示例

// 隐式转换:+ 与 - 的不对称
console.log('拼接:', '1' + 2); // '12'
console.log('相减:', '1' - 2); // -1
console.log('混合:', 1 + 2 + '3', '1' + 2 + 3); // '33' 与 '123'

// 显式转换
console.log(Number('3.14'), Number('abc'), Number(''), Number(null), Number(undefined));
console.log(parseInt('42px'), parseInt('10', 2), parseFloat('3.14abc'));

// 布尔转换:六个假值
const falsyThings = [false, 0, '', null, undefined, NaN];
console.log('假值个数:', falsyThings.filter((v) => !v).length);
console.log('空数组是真值:', Boolean([]), Boolean({}));

// 推荐写法:显式转换让意图清晰
const input = '123';
console.log('显式转数字:', Number(input) + 1);

常见坑

  • 依赖隐式转换写「聪明」代码:+'123'、!!value 虽然常见,但可读性差,团队代码里优先写 Number()、Boolean()。
  • NaN 不等于自己:NaN === NaN 是 false,判断 NaN 要用 Number.isNaN(),不要用 == 或 ===。
  • Number('') 是 0:表单里用户没填的输入框取出来是 '',直接 Number() 会变成 0 而不是报错,校验时要先判断空串。
  • parseInt 解析小数:parseInt('3.99') 是 3,它不是四舍五入而是直接截断;要四舍五入用 Math.round。

小结

隐式转换主要在 + 和 == 中发生,规则繁琐难记;工程上的对策是主动用 Number/String/Boolean 做显式转换,并用 === 杜绝隐式相等。下一节开始逐个深入核心类型,先看字符串。