if语句的使用到进阶

229 阅读8分钟

彻底搞懂 if 语句:从基础语法到实战进阶

image.png

一、if 语句的本质:解决「二选一」的逻辑判断

在编程中,我们经常需要根据「某个条件是否成立」来执行不同的代码块 —— 比如用户登录时验证密码是否正确、计算折扣时判断用户等级、处理请求时检查参数是否合法。if 语句的核心作用,就是将这种「满足条件就做 A,不满足就做 B(或不做)」的人类逻辑,转化为计算机可执行的代码。

1.1 基础语法结构

scss
 体验AI代码助手
 代码解读
复制代码
// 单分支:满足条件则执行
if (条件表达式) {
  // 条件为 true 时执行的代码块
}
// 双分支:二选一执行
if (条件表达式) {
  // 条件为 true 时执行
} else {
  // 条件为 false 时执行
}
// 多分支:多选一执行
if (条件1) {
  // 条件1 为 true 时执行
} else if (条件2) {
  // 条件1 为 false,条件2 为 true 时执行
} else if (条件3) {
  // 前两个条件都为 false,条件3 为 true 时执行
} else {
  // 所有条件都为 false 时执行(可选)
}

关键注意点

  • 条件表达式的结果必须是「布尔值」(true/false),若不是则会自动进行类型转换(如 0 转 false、非空字符串转 true);
  • 若代码块只有一行语句,大括号 {} 可省略,但强烈建议保留(避免后续扩展代码时出现逻辑错误);
  • 多分支中,只会执行第一个满足条件的代码块,后续条件即使成立也会被跳过。

二、if 语句的常见应用场景

2.1 场景 1:参数合法性校验

在函数或接口调用中,首先用 if 判断参数是否符合要求,提前拦截非法输入,是保障程序稳定性的基础操作。

示例:实现一个「计算两数相加」的函数,要求参数必须是数字:

javascript
 体验AI代码助手
 代码解读
复制代码
function add(a, b) {
  // 校验参数是否为数字
  if (typeof a !== 'number' || typeof b !== 'number') {
    return new Error('参数必须是数字类型');
  }
  // 校验通过,执行核心逻辑
  return a + b;
}
// 测试
console.log(add(2, 3)); // 5
console.log(add(2, '3')); // Error: 参数必须是数字类型

2.2 场景 2:业务逻辑分支判断

根据不同的业务状态或用户属性,用 if 执行对应的逻辑,比如根据用户等级发放不同的优惠券。

示例:根据用户等级(普通 / 会员 / VIP)发放优惠券:

ini
 体验AI代码助手
 代码解读
复制代码
function getCoupon(userLevel) {
  let couponAmount = 0;
  
  if (userLevel === '普通用户') {
    couponAmount = 10; // 普通用户发10元券
  } else if (userLevel === '会员') {
    couponAmount = 30; // 会员发30元券
  } else if (userLevel === 'VIP') {
    couponAmount = 50; // VIP发50元券
  } else {
    return '未知用户等级,无法发放优惠券';
  }
  
  return `您的优惠券金额:${couponAmount}元`;
}
// 测试
console.log(getCoupon('会员')); // 您的优惠券金额:30元
console.log(getCoupon('SVIP')); // 未知用户等级,无法发放优惠券

2.3 场景 3:嵌套条件判断

当业务逻辑需要「多层条件筛选」时,可使用嵌套 if(但需注意嵌套层数,避免过度复杂)。

示例:判断一个学生的考试成绩是否合格,且是否需要补考(总分 100 分,60 分合格,合格但低于 70 分需补考):

javascript
 体验AI代码助手
 代码解读
复制代码
function checkExamScore(score) {
  if (score >= 0 && score <= 100) { // 第一层:先校验分数是否在合理范围
    if (score >= 60) { // 第二层:分数合格
      if (score < 70) { // 第三层:合格但需补考
        return '成绩合格,但需参加补考';
      } else {
        return '成绩合格,无需补考';
      }
    } else {
      return '成绩不合格,需重新考试';
    }
  } else {
    return '分数输入错误(需在0-100之间)';
  }
}
// 测试
console.log(checkExamScore(65)); // 成绩合格,但需参加补考
console.log(checkExamScore(105)); // 分数输入错误(需在0-100之间)

三、if 语句的进阶技巧:写出更优雅的代码

3.1 技巧 1:提前 return,减少嵌套层级

当嵌套 if 超过 2 层时,代码可读性会大幅下降。此时可通过「提前 return 非法条件」,将嵌套结构转为平铺结构。

优化前(嵌套层级深)

kotlin
 体验AI代码助手
 代码解读
复制代码
function handleUserRequest(user, requestType) {
  if (user.isLogin) { // 第一层:用户已登录
    if (user.hasPermission(requestType)) { // 第二层:用户有权限
      if (requestType === 'read') { // 第三层:请求类型是读取
        return '执行读取操作';
      } else if (requestType === 'write') {
        return '执行写入操作';
      }
    } else {
      return '无权限访问';
    }
  } else {
    return '请先登录';
  }
}

优化后(提前 return,无嵌套)

kotlin
 体验AI代码助手
 代码解读
复制代码
function handleUserRequest(user, requestType) {
  // 非法条件提前 return,减少嵌套
  if (!user.isLogin) return '请先登录';
  if (!user.hasPermission(requestType)) return '无权限访问';
  
  // 核心逻辑平铺处理
  if (requestType === 'read') return '执行读取操作';
  if (requestType === 'write') return '执行写入操作';
}

3.2 技巧 2:多条件判断用「数组 includes」替代多个 ||

当 if 的条件是「判断某个值是否在多个选项中」时,用 Array.includes() 替代多个 ||,代码更简洁。

优化前(多个 ||,冗长)

javascript
 体验AI代码助手
 代码解读
复制代码
function checkValidCity(city) {
  if (city === '北京' || city === '上海' || city === '广州' || city === '深圳') {
    return '一线城市,支持配送';
  } else {
    return '暂不支持该城市配送';
  }
}

优化后(Array.includes,简洁)

javascript
 体验AI代码助手
 代码解读
复制代码
function checkValidCity(city) {
  const supportCities = ['北京', '上海', '广州', '深圳'];
  if (supportCities.includes(city)) {
    return '一线城市,支持配送';
  } else {
    return '暂不支持该城市配送';
  }
}

3.3 技巧 3:复杂条件抽离为单独函数

当 if 的条件表达式过于复杂(比如包含多个逻辑运算符、函数调用)时,将条件抽离为单独的函数,提升代码可读性。

优化前(条件表达式复杂)

vbnet
 体验AI代码助手
 代码解读
复制代码
function canSubmitOrder(order) {
  // 条件表达式冗长,难以快速理解
  if (order.goods.length > 0 && order.totalAmount >= 10 && !order.isExpired && order.userAddress) {
    return true;
  } else {
    return false;
  }
}

优化后(条件抽离为函数)

javascript
 体验AI代码助手
 代码解读
复制代码
function canSubmitOrder(order) {
  // 调用单独函数,条件含义一目了然
  if (isOrderValid(order)) {
    return true;
  } else {
    return false;
  }
}
// 抽离的条件判断函数
function isOrderValid(order) {
  const hasGoods = order.goods.length > 0; // 有商品
  const meetMinAmount = order.totalAmount >= 10; // 满足最低金额
  const notExpired = !order.isExpired; // 未过期
  const hasAddress = !!order.userAddress; // 有收货地址
  
  return hasGoods && meetMinAmount && notExpired && hasAddress;
}

四、if 语句的常见陷阱,你踩过几个?

4.1 陷阱 1:混淆「==」和「===」导致的类型转换错误

在 JavaScript 中,== 会自动进行类型转换,而 === 严格判断类型和值。使用 == 可能导致意想不到的结果。

反例

ini
 体验AI代码助手
 代码解读
复制代码
const score = '60';
if (score == 60) { // '60' 转数字后等于 60,条件为 true
  console.log('成绩合格'); // 会执行,但实际 score 是字符串类型
}

正例:使用 === 严格判断:

arduino
 体验AI代码助手
 代码解读
复制代码
const score = '60';
if (score === 60) { // 字符串和数字类型不同,条件为 false
  console.log('成绩合格'); // 不执行
} else {
  console.log('分数类型错误'); // 正确执行
}

4.2 陷阱 2:多分支中遗漏 else,导致逻辑不完整

当业务需要「覆盖所有可能情况」时,遗漏 else 会导致部分场景下没有返回值,出现 undefined。

反例

sql
 体验AI代码助手
 代码解读
复制代码
function getSeason(month) {
  if (month >= 3 && month <= 5) {
    return '春季';
  } else if (month >= 6 && month <= 8) {
    return '夏季';
  } else if (month >= 9 && month <= 11) {
    return '秋季';
  }
  //month1212 时,没有返回值,结果为 undefined
}

正例:补充 else 覆盖所有情况:

sql
 体验AI代码助手
 代码解读
复制代码
function getSeason(month) {
  if (month >= 3 && month <= 5) {
    return '春季';
  } else if (month >= 6 && month <= 8) {
    return '夏季';
  } else if (month >= 9 && month <= 11) {
    return '秋季';
  } else {
    return '冬季'; // 覆盖 1212 的情况
  }
}

4.3 陷阱 3:过度嵌套导致「回调地狱」式代码

当 if 嵌套层数过多(比如超过 3 层),代码会像「金字塔」一样向右延伸,可读性极差。

反例

vbnet
 体验AI代码助手
 代码解读
复制代码
function processOrder(order) {
  if (order.paid) {
    if (order.stock > 0) {
      if (order.address) {
        if (order.coupon) {
          return '使用优惠券后发货';
        } else {
          return '直接发货';
        }
      } else {
        return '缺少收货地址';
      }
    } else {
      return '库存不足';
    }
  } else {
    return '未付款';
  }
}

正例:用「提前 return」优化:

vbnet
 体验AI代码助手
 代码解读
复制代码
function processOrder(order) {
  if (!order.paid) return '未付款';
  if (order.stock <= 0) return '库存不足';
  if (!order.address) return '缺少收货地址';
  
  return order.coupon ? '使用优惠券后发货' : '直接发货';
}

五、总结:写好 if 语句的 3 个核心原则

  1. 可读性优先:不要为了「精简代码」而牺牲可读性,比如将复杂条件写在一行、省略必要的大括号;
  1. 减少嵌套层级:通过「提前 return 非法条件」,将嵌套结构转为平铺结构,嵌套层数尽量不超过 2 层;
  1. 覆盖所有场景:在多分支判断中,用 else 或明确的条件覆盖所有可能情况,避免出现 undefined 或逻辑漏洞。

标签:人工智能 作者:白曦
链接:juejin.cn/post/756084…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处