怎么知道一个箱子里装的是数字还是文字?怎么把文字变数字?本页解决认类型和转类型两件事。
核心三步:
① typeof——认类型,返回类型字符串
② Number() / parseInt() / parseFloat()——转数字
③ String() / toString()——转字符串
坑:typeof null 返回 "object"(历史 bug)、parseInt("12px") 得 12、空字符串转数字得 0。
有时候你不确定箱子里装的是数字还是文字,就用 typeof 变量名 问它一句,它会"递出"一个类型的名字(这个动作叫"返回",就是把结果交出来)。
// 装个数字 10 let num = 10; console.log(typeof num); // 装一段文字 10(带引号,是字符串) let str = '10'; console.log(typeof str); // 布尔值,只有 true/false 两种 let bool = true; console.log(typeof bool); // 只要箱子,没放东西 let undef; console.log(typeof undef); // 你主动把箱子设成空 let empty = null; // 答 "object",这是 JS 历史 bug console.log(typeof empty);
如果你看到 typeof null 答 "object" 觉得自己写错了,其实没写错——这是 JS 第一版留下的历史 bug,全世界都知道,但改它会让无数老网站崩掉,所以一直留着。判断是不是 null,得单独写 x === null。
有时候你需要把数字"123"变成能拼进句子的文字。有三种常用办法:
| 办法 | 怎么写 | 感觉 |
|---|---|---|
| String() | String(num) | 主动喊它变 |
| toString() | num.toString() | 主动喊它变 |
| 加个空字符串 | num + '' | 浏览器偷偷帮你变 |
// 现在是数字 let n = 123; // "123" → 变成文字了 console.log(String(n)); // "123" console.log(n.toString()); // "123" → 一加空文字,整体就成文字了 console.log(n + '');
从输入框拿到的都是文字(比如 "3.14"),要算数就得先变数字。三个工具性格不一样:
| 工具 | 性格 | "3.14abc" 转出来 |
|---|---|---|
| Number() | 较真:整个必须是合法数字,有一点杂质就转成 NaN(算不出来) | NaN |
| parseInt() | 捞整数:从左往右捞,碰到非数字就停 | 3 |
| parseFloat() | 捞小数:从左往右捞,能带小数点 | 3.14 |
// 3.14
Number("3.14");
// NaN(里面有 abc,较真的它不干)
Number("3.14abc");
// 3(只捞开头的整数)
parseInt("3.14abc");
// 3.14(把开头的小数也捞出来)
parseFloat("3.14abc");
// NaN
Number("abc");
如果 Number('123abc') 和 parseInt('123abc') 你以为结果一样,其实不一样:Number 较真是 NaN,parseInt 会"捞"出 123。这是自测题里的高频题,记住"Number 较真、parse 能捞"。
① 可能在什么地方用:校验用户输入是不是数字;把表单里的字符串转成数字再计算。
② 常见的问题:Number('123abc') 得到 NaN 还接着算;或者看到 typeof null 是 object 以为自己写错了。
③ 解决思路:转完用 isNaN() 检查一下是不是 NaN;判空值要单独写 === null,别只靠 typeof。
| API | 作用 | 参数 | 返回值 | 代码示例 |
|---|---|---|---|---|
| String() | 把值转成字符串 | 任意值 | 字符串 | let num = 123; |
| toString() | 数字/值转字符串(方法写法) | 无 | 字符串 | let num = 123; |
| Number() | 把值转成数字 | 任意值 | 数字 / NaN | console.log(Number("3.14")); |
| parseInt() | 取整数部分 | 字符串, 进制 | 整数 / NaN | console.log(parseInt("3.14abc")); // 3 |
| parseFloat() | 取小数部分 | 字符串 | 小数 / NaN | console.log(parseFloat("3.14abc")); // 3.14 |
| typeof | 查转换完是什么类型 | 任意值 | 类型字符串 | console.log(typeof 123); // "number" |