JavaScript 如何类型转换

你有没有过这种经历?写代码时明明给变量存了个数字,结果输出却变成了带引号的“数字”;或是把两个内容看起来是数字的值加起来,结果却像拼字符串一样出了奇怪的组合。这背后大多是JavaScript的类型转换在“搞鬼”——它就像一个看不见的小翻译,总在悄悄把不同类型的内容转来转去,要是摸不清它的脾气,很容易写出出bug的代码。

先搞懂:JS里的基础类型有啥?

要理解类型转换,得先知道JS里常见的“数据类型”。就像我们生活里有不同的东西:数字是用来计数的“积木块”,文字是写笔记的“纸条”,真假是判断对错的“对错卡”,还有空值、未定义的“空白页”。这些都是JS的基础类型,而类型转换,就是这个小翻译把一种“物品”换成另一种的过程。

JavaScript 如何类型转换

举个最简单的例子:你把数字5和字符串“3”用加号连起来,输出的不是8,而是“53”——因为小翻译看到加号旁边有字符串“纸条”,就会把数字“积木”5换成“纸条”,再把两个纸条拼在一起。要是换成减号呢?“5” - 3就会得到2,因为减号只认数字,它会把“5”这个“纸条”转换成数字5,再做减法。这就是最直观的类型转换差异。

自动转换:小翻译的“默认操作”

JS里的类型转换分两种,一种是它偷偷做的,叫“隐式转换”,就像你没要求,它却主动帮你把东西换好了。最常见的场景就是比较和运算。

比如你判断“10” > 5,结果是true——这里JS会自动把字符串“10”换成数字10,再和5比较。但要是你用双等号(==)判断“10” == 5,结果却是false?不对,等一下,“10” == 10才是true,“10” == 5是false,因为字符串“10”转成数字是10,和5不相等。再比如空值null,用==判断它等于undefined,这也是JS的隐式规则,就像小翻译默认把这两个“空白页”看成一类。

但这种自动转换很容易出问题,比如你写if (0) { ... },括号里的条件是false,因为JS把数字0自动转成了“假值”;要是写if ("0") { ... },结果却是true,因为字符串“0”转成了“真值”——同样是0的内容,类型不同,转换结果完全不一样,这就是很多新手踩坑的地方。

手动转换:主动“要求翻译”

要是不想让小翻译自作主张,你可以主动告诉它要转成什么类型,这叫“显式转换”,就像你拿着纸条说“帮我把它换成积木”。

转数字的话,用Number()就像把“纸条”仔细拼成数字,比如Number("123")会得到123,Number("abc")会得到特殊的“非数字”NaN;要是用parseInt(),它会从字符串开头找数字,直到遇到非数字为止,比如parseInt("123abc")会得到123,而Number()就会直接返回NaN。

转字符串更简单,用String()或者直接加空引号,比如把数字456转成字符串,加个""就会变成"456",就像把积木贴了层“纸条标签”。转布尔值的话,用Boolean(),像空字符串、0、null这些会变成false,其他的大多变成true,这也是判断条件时常用的方法。

避开坑:别让转换变“乌龙”

很多bug都来自隐式转换的“自作主张”,所以有个简单的小技巧:除非你明确需要转换,否则尽量用三等号(===)代替双等号(==)。比如10 === "10"会直接判断类型不同,结果是false,不会再自动转换,能避免很多意外。

比如你要统计用户输入的数字,要是没做处理就用"用户输入" + 5,结果就会是字符串组合;要是先把输入转成数字再运算,就不会出错。就像买东西时,把优惠券(字符串)和现金(数字)放一起,要是没把优惠券转成等价的金额,就没法正确计算总价——JS的类型转换也是这个道理,搞清楚它的规则,就能少踩坑,写代码更顺畅。

上一篇 TypeScript in 怎么用