JavaScript类型转换分隐式和显式,隐式转换在==、+、-等运算及布尔判断中自动发生,如1+"2"→"12"、"6"-"2"→4、[]为真值;对象转换先调用valueOf()再toString()。

JavaScript类型转换是指在运算或比较过程中,不同数据类型之间自动或手动变为同一类型的过程。其中隐式转换(也叫自动类型转换)是JS引擎在不加干预时悄悄完成的,它不写明转换动作,但会深刻影响结果——尤其容易在==、+、-等操作中引发意外。
什么时候会发生隐式转换
主要出现在以下三类场景:
- 使用
==、!=、>、等比较运算符,且两边类型不一致时 - 使用
+、-、*、/、%等算术运算符,参与运算的值不是纯数字 - 进入
if、while、&&、||等逻辑判断上下文时
+号运算的字符串优先规则
加法运算符+是隐式转换里最易踩坑的一个:只要有一个操作数是字符串,整个表达式就走字符串拼接路线。
-
1 + "2"→"12"(数字转字符串) -
true + "hello"→"truehello"(布尔转字符串) -
[] + {}→"[object Object]"(空数组转为空字符串"",对象调用toString()) - 但
1 + 2 + "3"→"33"(从左到右计算:1+2=3,再3+"3"="33")
数学运算符强制转数字
减、乘、除、取余等运算符会尝试把操作数统一转为数字,失败则得NaN。
立即学习“Java免费学习笔记(深入)”;
-
"6" - "2"→4(两个字符串都成功转为数字) -
"10" / "2"→5 -
null - 1→-1(null转为0) -
undefined * 2→NaN(undefined转数字是NaN) -
"abc" - 1→NaN(无法解析为有效数字)
布尔判断中的真假值映射
在if、while、三元运算或逻辑运算中,所有值都会被当作布尔值处理,只分“真值”(truthy)和“假值”(falsy)两类:
-
假值只有6个:
false、0、-0、0n、""(空字符串)、null、undefined、NaN -
其余全是真值:包括
"0"、"false"、[]、{}、function(){}等 -
if ([])执行块内代码(空数组是真值) -
Boolean("0")→true,不是false
对象怎么转基本类型
对象参与运算时,JS会按顺序尝试把它变成原始值:
- 先调用
valueOf(),如果返回的是原始类型(如数字、字符串),就直接用它 - 否则调用
toString(),用它的返回值 - 若两者都未返回原始值,则报错
- 还可以自定义
[Symbol.toPrimitive](hint)方法,控制不同场景下的转换行为(hint可能是"number"、"string"或"default") - 例如:
+[1,2]→NaN(数组valueOf()返回自身,非原始值;toString()返回"1,2",再转数字失败)










