说说烂大街的if/if...else...,程序中用得最多的流程判断语句。
对着曾经满屏的if/if...else...,心想能不能搞点事情,折腾点浪花浪里呀浪。
对顶着“这个需求很简单,怎么实现我不管,明天上线”的程序猿,答案必须YES。
"Write Less, Do More",学习进步的本质就是为了更有效率地偷懒。
废话说完,直接上方法汇总,让我们来一窥究竟:
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...的用法实际使用不多,仅供参考。
一般case为常量时switch...case...用得较多。
选择分支较多时,建议选用switch…case可提高程序的效率,但switch...case不足的地方在于只能处理字符或者数字类型的变量,if…else更加灵活,可用于判断表达式是否成立,比如if(a+b>c),if…else的应用范围更广。
三元运算符改写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
原理:利用逻辑判断的短路运算来实现
短路:&& 中第一个表达式为假就不会去处理第二个表达式,|| 则相反
// 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作用,但不可作用于函数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.判断值需为确定值,如== ,其它如>=https://www.jb51.net/<=https://www.jb51.net/>/<不适用
2.条件作为对象属性,需要注意对象属性的读取方式
--------------------------------------------------------------------------------
知识点插播 —— (2)
JS的命名规则(变量的命名规则)
•标识符只能由字母、数字、下划线和‘$'组成
•数字不可以作为标识符的首字符
对象属性的命名规则
•通过[]操作符为对象添加属性时,属性名可以是任何字符串(包括只包含空格的字符串和空字符串);
•通过.操作符为对象添加属性时,属性名必须是合法的标识符名称;
•如果属性名包含非法的标识符字符,则只能采用obj[“propertyName”]的形式;
•如果属性名是合法的标识符,读取时可采用obj.propertyName或obj[“propertyName”]的形式;
--------------------------------------------------------------------------------
策略模式
策略模式:定义一系列的算法,把它们一个个封装起来,目的就是将算法的使用与算法的实现分离开来
以下为常见的表单验证,用策略模式来构建,替换if...else的方式