switch 语句必须使用严格相等(===)匹配,因其设计为直接对表达式结果与 case 字面量进行类型和值的双重比对,不执行任何隐式转换;case 值须为静态字面量,且 NaN、null、undefined 等均独立匹配。

switch 语句内部用 === 匹配,意思是它不转换类型,只认“值和类型都完全一样”的情况。比如 "2" 和 2 在 switch 里是两个完全不同的分支,哪怕看起来一样,也不会走同一个 case。
为什么必须是严格相等(===)?
这是 JavaScript 语言设计决定的:switch 的匹配逻辑不是靠你写判断表达式,而是直接拿表达式的运行结果,挨个跟每个 case 后面的字面量做 === 比较。引擎不会帮你调用 Number()、toString() 或任何隐式转换。
- 如果表达式结果是字符串
"10",那只有case "10":能命中,case 10:不会执行 - 如果表达式结果是布尔值
true,case 1:或case "true":都不匹配 -
null和undefined各自独立匹配,case null:不会捕获undefined
常见“不匹配”其实是类型没对上
很多看似该进某个 case 却没进,根源往往是表达式返回了意料之外的类型:
- 从表单输入框取的值永远是字符串,哪怕用户输的是数字
-
document.getElementById().value、prompt()、URL 查询参数解析结果都是字符串 - JSON 解析后字段类型错误(比如后端把数字当字符串传了)
- 函数返回值未明确处理,比如本该返回数字却返回了
undefined或空字符串
调试时可以用 console.log(typeof value, value) 同时看类型和值,比只看值更有效。
立即学习“Java免费学习笔记(深入)”;
case 值本身也受 === 规则约束
每个 case 后面只能跟静态字面量(如 "hello"、42、false、null),不能是变量或表达式。而且这些字面量参与比较时,也按 === 规则解释:
-
case NaN:永远不会触发——因为NaN === NaN是false -
case "":只匹配空字符串,不匹配null、undefined或0 -
case 0:不匹配false,也不匹配-0(虽然0 === -0是true,但极少有场景需要区分)
想绕过类型限制?得提前归一化
switch 本身不支持类型转换,但你可以在进入 switch 前,把表达式结果统一成你期望的类型:
- 转数字:
switch (Number(input)) { case 1: ... }(注意Number("")是0,Number("abc")是NaN) - 转字符串:
switch (String(value)) { case "true": ... } - 标准化字符串:
switch (input?.trim().toLowerCase()) { case "yes": ... }
关键是把转换逻辑放在 switch 外部,而不是指望 case 自己做适配。


















