If语句
if语句用于需要根据逻辑条件执行不同语句的场景。当逻辑条件为真时,执行对应的一组语句,否则执行另一组语句(如果有的话)。
else部分也可能包含if语句。
if语句如下所示:
if (condition1) {
// 语句1
} else if (condition2) {
// 语句2
} else {
// else语句
}
条件表达式可以是任何类型,非boolean类型会进行隐式类型转换:
let s1 = 'Hello';
if (s1) {
console.info(s1); // 打印“Hello”
}
let s2 = 'World';
if (s2.length != 0) {
console.info(s2); // 打印“World”
}
Switch语句
使用switch语句执行与switch表达式值匹配的代码块。
switch语句如下所示:
switch (expression) {
case label1: // 如果label1匹配,则执行
// ...
// 语句1
// ...
break; // 可省略
case label2:
case label3: // 如果label2或label3匹配,则执行
// ...
// 语句23
// ...
break; // 可省略
default:
// 默认语句
}
如果switch表达式的值等于某个label的值,则执行相应的语句。
如果没有任何一个label值与表达式值相匹配,并且switch具有default子句,那么程序会执行default子句对应的代码块。
break语句(可选的)允许跳出switch语句并继续执行switch语句之后的语句。
如果没有break语句,则执行switch中的下一个label对应的代码块。
条件表达式
条件表达式根据第一个表达式的布尔值来返回其他两个表达式之一。
示例如下:
condition ? expression1 : expression2
如果condition的值为真值(转换后为true的值),则使用expression1作为该表达式的结果;否则,使用expression2。
示例:
let message = Math.random() > 0.5 ? 'Valid' : 'Failed';
condition如果是非bool值则会进行隐式转换。
示例:
console.info('a' ? 'true' : 'false'); // true
console.info('' ? 'true' : 'false'); // false
console.info(1 ? 'true' : 'false'); // true
console.info(0 ? 'true' : 'false'); // false
console.info(null ? 'true' : 'false'); // false
console.info(undefined ? 'true' : 'false'); // false
if与Switch的区别
条件类型:
if:可以测试任何类型的布尔条件
switch:只能测试相等性条件,且表达式结果必须是整数、枚举、字符串或字符类型
执行流程:
if:从上到下逐条判断,找到第一个满足的条件就执行对应代码块
switch:先计算表达式的值,然后直接跳转到匹配的case标签处,若无break则会继续执行下一个case(称为"fall-through"特性)
性能:
if:多个条件时需要逐个判断,性能可能较低
switch:编译器通常会优化为跳转表或二分查找,对于多条件比较通常更高效
适用场景:
if:适合复杂条件判断、不同类型条件、范围判断
switch:适合单个变量与多个确定值的比较
可读性:
if:条件复杂时可能导致嵌套过深,可读性下降
switch:对于多值比较时结构更清晰
灵活性:
if:可以处理任意复杂的条件表达式
switch:表达能力相对有限,但结构更规范
使用建议
- 当需要比较同一变量的多个可能值时,优先使用switch
- 当条件涉及范围判断或复杂逻辑时,使用if
- 在switch中记得使用break避免意外的fall-through
- 对于只有少量简单条件的情况,两者差别不大,可根据代码风格选择
特性 | if 语句 | switch 语句 | ||
---|---|---|---|---|
语法结构 | if (条件) {...} else if (条件) {...} else {...} | switch (表达式) { case 值1: ... break; case 值2: ... break; default: ... } | ||
条件类型 | 可测试任何布尔条件(支持比较运算符、逻辑运算符等组合) | 仅支持表达式与常量值的相等性判断,表达式结果需为整数、枚举、字符串或字符类型 | ||
条件复杂度 | 支持复杂逻辑表达式(如 `a > 5 && b < 10 | c === true`) | 仅支持单个表达式与固定常量的匹配(如 case 1: , case "apple": ) | |
执行流程 | 从上到下逐条判断条件,执行第一个满足条件的分支后终止(或执行 else) | 先计算表达式值,直接跳转到匹配的 case 分支;若未加 break ,会继续执行后续 case (Fall-through) | ||
性能 | 多条件时需依次判断,条件数量越多,判断效率可能越低 | 编译器通常优化为跳转表或二分查找,多值比较时效率更高(尤其条件数量≥5 时) | ||
适用场景 | 复杂条件判断(范围、逻辑组合)、不同类型条件混合判断 | 单个变量 / 表达式与多个确定值的匹配(如状态码、枚举值、固定选项) | ||
可读性 | 条件少时简洁清晰,条件过多时易出现嵌套过深(如多层 else if ) | 多值比较时结构更规整,分支清晰,减少代码冗余 | ||
灵活性 | 极高,可处理任意复杂的条件逻辑(包括动态计算的条件) | 表达能力有限,仅支持固定值匹配,无法直接处理范围或逻辑组合条件 | ||
Fall-through 特性 | 无,每个分支执行后自动终止(除非显式嵌套) | 默认存在,需手动添加 break 防止分支穿透(可利用该特性实现多值共享逻辑) | ||
默认情况处理 | 通过 else 子句处理所有未匹配的条件 | 通过 default 子句处理表达式未匹配任何 case 的情况 | ||
代码量 | 条件多时需重复编写判断逻辑,代码量较大 | 条件越多越能体现简洁性,无需重复编写表达式 | ||
嵌套支持 | 支持多层嵌套(如 if 内部嵌套 if ),但过深会降低可读性 | 支持 case 内部嵌套 if 或 switch ,但整体结构更扁平化 | ||
常量要求 | 条件可包含变量、函数调用等动态值 | case 后的值必须是编译期常量(如字面量、枚举值),不能是变量或动态表达式 |