说说烂大街的if/if...else...
,程序中用得最多的流程判断语句。
对着曾经满屏的if/if...else...
,心想能不能搞点事情,折腾点浪花浪里呀浪。
对顶着“这个需求很简单,怎么实现我不管,明天上线”的程序猿,答案必须YES。
“Write Less, Do More”,学习进步的本质就是为了更有效率地偷懒。
废话说完,直接上方法汇总,让我们来一窥究竟:
switch改写if
|
|
以上代码的switch...case...
的用法实际使用不多,仅供参考。
一般case为常量时switch...case...
用得较多。
选择分支较多时,建议选用switch…case
可提高程序的效率,但switch...case
不足的地方在于只能处理字符或者数字类型的变量,if…else
更加灵活,可用于判断表达式是否成立,比如if(a+b>c)
,if…else
的应用范围更广。
三元运算符改写if
|
|
优点:代码简化,更加清爽,write less
缺点:复杂的三元运算符可读性较差,需友好注释
TIPS: 三元运算符后面不能带return
|
|
逻辑判断 and(&&)和or(||) 改写if
原理:利用逻辑判断的短路运算来实现
短路:
&&
中第一个表达式为假就不会去处理第二个表达式,||
则相反
|
|
优点:代码简化,更加清爽,write less
缺点:适用于简单判断逻辑,复杂的判断运算可读性较差,需友好注释
TIPS:适用于没有else的场景, 逻辑运算符后面不能带return
|
|
知识点插播 —— (1)
三元运算符和逻辑运算符都有一层return作用,但不可作用于函数return语句,所以像以下这种用法都是错误的;
12345// 错误用法function getResult(value) {value ? 'yes' : 'no';}var result = getResult(true); // 并不会有值返回js逻辑运算中,
0/""/null/false/undefined/NaN
都会判为false
,其它都为true
;- 很多开源代码中可见
if(!!attr)
,为什么不直接写if(attr)
, 其实这是一种更严谨的写法,!!attr
会强制转化为boolean类型。typeof !!attr == true
比typeof attr == true
更加严谨。
对象属性
|
|
TIPS:
- 判断值需为确定值,如
==
,其它如>=/<=/>/<
不适用 - 条件作为对象属性,需要注意对象属性的读取方式
知识点插播 —— (2)
JS的命名规则(变量的命名规则)
- 标识符只能由字母、数字、下划线和‘$’组成
- 数字不可以作为标识符的首字符
对象属性的命名规则
- 通过
[]
操作符为对象添加属性时,属性名可以是任何字符串(包括只包含空格的字符串和空字符串); - 通过
.
操作符为对象添加属性时,属性名必须是合法的标识符名称; - 如果属性名包含非法的标识符字符,则只能采用
obj[“propertyName”]
的形式; - 如果属性名是合法的标识符,读取时可采用
obj.propertyName
或obj[“propertyName”]
的形式;
策略模式
策略模式:定义一系列的算法,把它们一个个封装起来,目的就是将算法的使用与算法的实现分离开来
以下为常见的表单验证,用策略模式来构建,替换if...else
的方式
|
|
- 第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程;
- 第二个部分是环境类Context,该Context接收客户端的请求,随后把请求委托给某一个策略类;
优点:
- 有效避免多重条件选择语句
- 提供了对外开放 - 封装原则的完美支持,将方法封装在独立的strategy中,使得它们易于切换、易于理解、易于扩展。
- 复用性
缺点:
- 增加了策略类/对象的使用
- 使用策略模式,必须先了解所有的strategy,违反了最少知识原则
参考资料
作者:以乐之名
本文原创,有不当的地方欢迎指出。转载请指明出处。