详解JavaScript 中 if / if...else...替换方式

作者:极速慢跑时间:2026-10-22 16:02:53浏览:440

本文深入解析 JavaScript 中多种替代 if/else 语句的高效写法。涵盖 switch-case、三元运算符、逻辑短路运算及策略模式,通过具体代码示例展示如何简化逻辑判断、提升代码可读性与执行效率,并附带注意事项与最佳实践建议。

if/else 重构概述

if/else 重构概述

在程序开发中,if 和 if...else...是最为常见的流程控制语句,几乎无处不在。

面对满屏的 if/else 嵌套,我们不禁思考:是否可以通过更优雅的方式重构代码,让逻辑更清晰?

当面对“需求简单、工期紧迫”的开发场景时,我们需要快速给出解决方案,确保按时上线。

遵循“Write Less, Do More”的理念,提升编码效率、减少冗余代码,是技术进步的重要体现。

接下来,我们将汇总几种常见的 if/else 替代方案,逐一剖析其实现原理与适用场景。

switch 改写 if

switch 改写 if 语句


// if 版本
var a = 1;
if(a > 1 && a < 5) {
 return 1
} else if(a > 5 && a < 10){
 return 5
}else{
 return 10
}

// switch 改版
switch(true){
 case (a > 1 && a < 5):
  return 1
 case (a > 5 && a < 10):
  return 5
 default:
  return 10
}

上述代码展示了 switch...case...的用法,虽然在实际开发中使用频率不如 if 高,但值得参考。通常当 case 分支为常量时,switch...case...更为常用。

当选择分支较多时,建议使用 switch...case...以提高程序效率。然而,switch...case...的局限性在于仅能处理字符或数字类型的变量;相比之下,if...else...更为灵活,可用于判断任意表达式(如 if(a+b>c)),因此 if...else...的应用范围更广。

三元运算符改写 if

三元运算符改写 if 语句


// if 版本
if (bool) {
 value = 1;
} else {
 value = 2;
}

// 三元运算符 版本
value = bool ? 1 : 2;
// 三元预算符 多个运算需要括号包裹 此处用了逗号表达式
return typeof foo === 'object'?(console.log(1),1):(console.log(2),2);

优点:代码更加简洁清爽,符合“Write Less”的原则。

缺点:复杂的三元运算符可读性较差,建议添加友好注释以辅助理解。


TIPS: 三元运算符后面不能带return
// 错误用法,运算符号后不能带return
bool ? return 1 : return 2;

逻辑判断 and(&&)和or(||) 改写 if

利用逻辑判断 and(&&)和or(||) 改写 if 语句

原理:利用逻辑运算符的短路运算特性来实现条件判断。

短路机制:在 && 运算中,若第一个表达式为假,则不再处理第二个表达式;|| 运算则相反,若第一个表达式为真,则不再处理第二个表达式。


// if为真
if (bool) {
 value = getYes();
}
// &&改版
bool && (value = getYes());

// if为假
if (!bool) {
 value = getNo();
}
bool || (value = getNo());

优点:代码简化,更加清爽,符合“Write Less”的原则。

缺点:仅适用于简单判断逻辑,复杂判断运算可读性较差,需添加友好注释。

TIPS:此方法适用于没有 else 分支的场景,且逻辑运算符后面不能直接跟随 return 语句。


// 错误用法,运算符号后不能带return
boll || return true;

--------------------------------------------------------------------------------

关键注意事项与知识点

知识点插播 —— (1)

1. 三元运算符和逻辑运算符都具备返回值,但不能直接用于函数 return 语句。因此,以下用法是错误的:


// 错误用法
function getResult(value) {
 value ? 'yes' : 'no';
}
var result = getResult(true); // 并不会有值返回
1.js逻辑运算中,0/""/null/false/undefined/NaN都会判为false,其它都为true;
2.很多开源代码中可见if(!!attr),为什么不直接写if(attr), 其实这是一种更严谨的写法,!!attr会强制转化为boolean类型。typeof !!attr == true 比 typeof attr == true 更加严谨。
--------------------------------------------------------------------------------
对象属性
// if版本
if (a == 1) {
 return 'one';
} else if (a == 2) {
 return 'two';
} else if (a == 3) {
 return 'three';
} else {
 return '';
}
// 对象属性 改版
var ret = {
 1: 'one',
 2: 'two',
 3: 'three'
};
return ret[a] ? ret[a] : '';
TIPS:

1. 判断值需为确定值(如 ==),其它如 >=/<=/>/< 不适用; 2. 当条件作为对象属性时,需注意对象属性的读取方式。

--------------------------------------------------------------------------------

知识点插播 —— (2)

JS 的命名规则(变量的命名规则)

• 标识符只能由字母、数字、下划线和‘$'组成; • 数字不可以作为标识符的首字符。

对象属性的命名规则

• 通过 [] 操作符为对象添加属性时,属性名可以是任何字符串(包括只包含空格的字符串和空字符串); • 通过 . 操作符为对象添加属性时,属性名必须是合法的标识符名称; • 如果属性名包含非法的标识符字符,则只能采用 obj[“propertyName”] 的形式; • 如果属性名是合法的标识符,读取时可采用 obj.propertyName 或 obj[“propertyName”] 的形式;

--------------------------------------------------------------------------------

策略模式应用

策略模式

策略模式:定义一系列的算法,把它们一个个封装起来,目的就是将算法的使用与算法的实现分离开来。

以下为常见的表单验证场景,使用策略模式来构建,以此替代 if...else...语句。


// html
<form id = "registerForm" method="post" action="http://xxxx.com/api/register">
 用户名:<input type="text" name="userName">
 密码:<input type="text" name="password">
 手机号码:<input type="text" name="phoneNumber">
 <button type="submit">提交</button>
</form>
// js
// 策略对象
var strategies = {
 isNoEmpty: function (value, errorMsg) {
  if (value === '') {
   return errorMsg;
  }
 },
 isNoSpace: function (value, errorMsg) {
  if (value.trim() === '') {
   return errorMsg;
  }
 },
 minLength: function (value, length, errorMsg) {
  if (value.trim().length < length) {
   return errorMsg;
  }
 },
 maxLength: function (value, length, errorMsg) {
  if (value.length > length) {
   return errorMsg;
  }
 },
 isMobile: function (value, errorMsg) {
  if (!/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|17[7]|18[0|1|2|3|5|6|7|8|9])\d{8}$/.test(value)) {
   return errorMsg;
  }    
 }
}
// 验证类
var Validator = function() {
 this.cache = [];
}
Validator.prototype.add = function(dom, rules) {
 var self = this;
 for(var i = 0, rule; rule = rules[i++];) {
  (function(rule) {
   var strategyAry = rule.strategy.split(':');
   var errorMsg = rule.errorMsg;
   self.cache.push(function() {
   var strategy = strategyAry.shift();
   strategyAry.unshift(dom.value);
   strategyAry.push(errorMsg);
   return strategies[strategy].apply(dom, strategyAry);
   })
  })(rule)
 }
};
Validator.prototype.start = function() {
 for(var i = 0, validatorFunc; validatorFunc = this.cache[i++];) {
  var errorMsg = validatorFunc();
  if (errorMsg) {
   return errorMsg;
  }
 }
};
// 调用代码
var registerForm = document.getElementById('registerForm');
var validataFunc = function() {
 var validator = new Validator();
 validator.add(registerForm.userName, [{
  strategy: 'isNoEmpty',
  errorMsg: '用户名不可为空'
 }, {
  strategy: 'isNoSpace',
  errorMsg: '不允许以空白字符命名'
 }, {
  strategy: 'minLength:2',
  errorMsg: '用户名长度不能小于2位'
 }]);
 validator.add(registerForm.password, [ {
  strategy: 'minLength:6',
  errorMsg: '密码长度不能小于6位'
 }]);
 validator.add(registerForm.phoneNumber, [{
  strategy: 'isMobile',
  errorMsg: '请输入正确的手机号码格式'
 }]);
 var errorMsg = validator.start();
 return errorMsg;
}
registerForm.onsubmit = function() {
 var errorMsg = validataFunc();
 if (errorMsg) {
  alert(errorMsg);
  return false;
 }
}

• 第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程; • 第二个部分是环境类 Context,该 Context 接收客户端的请求,随后把请求委托给某一个策略类;

优点:

1. 有效避免多重条件选择语句; 2. 提供了对外开放 - 封装原则的完美支持,将方法封装在独立的 strategy 中,使得它们易于切换、易于理解、易于扩展; 3. 具有高复用性。

缺点:

1. 增加了策略类/对象的使用; 2. 使用策略模式,必须先了解所有的 strategy,违反了最少知识原则。

总结

以上所述是小编给大家介绍的 JavaScript 中 if / if...else...替换方式,希望对大家有所帮助。如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

作者最新文章