念:通过判断指定表达式的值来决定执行还是跳过某些语句,用于基于不同条件执行不同的动作。
JavaScript的条件语句,在我的理解中可以分为四种情况:
语法:
if(condition){
// 当条件为 true 时执行的代码
}
示例:
们在编写代码的时候,使用 if else 是一件非常寻常的事情,但是有些场景过多的if else 反而带来了代码理解的成本。
有时候我们可以使用其他的方式去避免使用大量嵌套的 if else。
本文将以 javascript 语言为例,其他编程语言也是大差不差的
重构前:
重构后:
通过逻辑与操作,可以将if代码直接消除,由于原始代码是单行的,所以重构后的代码直接是一行了。
如果是双行我们还可以将多行拆成颗粒度更细的函数,然后再使用 &&
多行代码重构前:
多行代码重构后:
三目运算符可以将 if-else 语句压缩成一行。特别是在为变量进行赋值的时候,三元运算法更加精简
三元运算符重构前:
三元运算符重构后:
在上面的案例中,使用三元运算符确保了变量只被赋值了一次,使得代码更加清晰。
当我们在 if-else 语句中有 3 个或更多分支或者嵌套 if时,我们也可以使用嵌套的 三元运算符实现嵌套的 if-else 的作用
嵌套的三元运算符重构前:
嵌套的三元运算符重构后:
虽然嵌套的三元运算符看起来有点怪,不过在不超过 3 个层级下的嵌套还是可以考虑嵌套三元运算符的。因为通过缩进我们还是可以看得出代码的清晰结构的。
如果要对一个输入的变量进行相关的判断,switch 语句是最好应用的场景,类似下面示例:通过switch 语句,根据用户传入的 action 的值进行依次判断并触发响应的逻辑。
switch 语句特殊的功能就是 break 关键词可以很好地让逻辑控制流在一个case 中执行,而不会被流向下一个 case
编程设计模式中有一个策略模式,就是预先定义一些策略,然后在进行判断的时候,每次都去策略库中进行判断执行。
一般我们都是使用 对象或者 Map 这样的数据结构去存储这些策略,通过对象的 [] 访问方法或 Map 的 get 方法去替代 if-else 分支语句
再次重申并不是说 if-else 语句不好,相反 if-else 在代码组织上也很直观,正因为如此,if-else语句在众多的编程语言中都存在。
不使用if-else 而使用其他的替代方式,是因为其他的方式可能会使代码更加简洁,更清晰,在有些场景下更加优雅,因此才会使用这些手段去替换 if-else.
------------
如果你有更多的想法或问题,欢迎在评论区分享你的看法。
如果对你有帮助的话,欢迎点赞、关注?、转发。
JavaScript中,对于 if else 的逻辑判断你肯定非常熟悉,本文罗列了几种你不一定知道的简写方式,仅供参考。
例子:
已知小明考了68分,小于60分为不及格,大于60分为及格,问:小明是否通过了考试?
if(score < 60){ alert('不及格'); }else{ alert('及格'); }
这没什么好说的,最基本的if else语法。可读性应该是最好的。
score < 60 ? alert('不及格') : alert('及格') ;
这种写法应该还算是比较多见的,而且,如果只有单纯的一个if判断的话,可读性也不是很差。
score < 60 && alert('不及格') ; score >=60 && alert('及格') ;
**&&的用法 **: 如果左边的结果为真,那么运行右边的表达式,如果右边的也为真,那么就返回真。其中,只要有一个为假,结果就是假。并且,一旦左边的结果为假,右边的就不执行了。
这里就是取了一个巧,因为我只是想要执行右边的表达式,无所谓返回值是什么。
那么,如果score < 60 为真,我不管三七二十一,都去执行一下右边的代码。我们的目的已经达到了。
这不就相当于这样吗:
if(score < 60==true){ alert('不及格') ; } if(score >=60==true){ alert('及格') ; }
简写:
if(score < 60){ alert('不及格') ; } if(score >=60){ alert('及格') ; }
就是说,一旦 ( ) 里面的表达式为真,就执行 { } 里面的内容。否则就不执行。
score < 60 || alert('及格') ; score >=60 || alert('不及格') ;
**|| 的用法 **: 如果左边的结果为真,那么直接返回true,右边的就忽略了!
如果左边为假,那么就运行右边的,看看右边的结果如何?如果右边为真,就返回真,否则返回假。
也就是说,不管右边的结果怎样,只要左边为假了,右边就无论如何会被执行一次的。这边也就是利用这个原理,相当于这样:
if(score < 60==false){ alert('及格') ; } if(score >=60==false){ alert('不及格') ; }
如果分数 < 60 是假的,是骗你的,不就是说分数 > 60 才是真相吗?哦,超过60分就是及格了,所以alert出来的是及格。
如果分数 >=60 是假的,是骗你的,不就是说分数 < 60 才是真相吗?哦,不满60分就是不及格了,所以alert出来的是不及格。
这样应该说的比较清楚了吧。
再说得白一点,就是:
你要么给我 < 60 ,要么给我 alert('及格') ;
你要么给我 >=60 ,要么给我 alert('不及格') ;
我们来一个小案例,看看可以怎么运用这些知识点?
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <style type="text/css"> .box1 { height:200px; width:300px; border: 1px solid #666; } .box2 { background: green; } </style> <script> </script> </head> <body> <div id='myBox' class='box1'></div> </body> </html>
我们引入了jQuery,现在希望自己来编写一个toggelClass,如何实现呢?
当我们点击这个div的时候,就自动将class换成box2。再次点击的时候,就把box2的样式去掉,依此循环。
上代码:
$('document').ready(function(){ function toggleClass(dom , className){ //判断该class是否已经存在 if(dom.hasClass(className)){ //如果存在,就去掉这个class dom.removeClass(className); }else{ //如果不存在,就加上这个class dom.addClass(className); } } $('#myBox').click(function(){ toggleClass($(this),'box2'); }); });
我猜想,jQuery对toggleClass的实现应该也差不多是这个意思。现在,我们考虑做如下简化:
第一种方式,用三目运算符简化:
function toggleClass(dom , className){ dom.hasClass(className) ? dom.removeClass(className) : dom.addClass(className); }
第二种方式,用&& 和 ||:
!dom.hasClass(className) && dom.addClass(className) || dom.removeClass(className);
可能有点绕,而且我也不是很推荐这种方式,一般来说,这种方式用于一些给变量赋值的场合。
我大概解释一下:
!dom.hasClass(className) && dom.addClass(className)
这表示如果dom元素不包含你指定的className,那么 !dom.hasClass(className) 是真,于是无论如何我都要执行右边的代码: dom.addClass(className) ,也就是说,给dom元素添加这个class。
这样一来,
!dom.hasClass(className) && dom.addClass(className)
这句话是不是已经成立了,OK,那么因为右边是 || , 左边都已经成立了,那么我右边的代码是不是可以不执行了呀?
好的,第二次点击:
!dom.hasClass(className)的意思是说,你这个dom元素是不是没有指定的class啊,不,我们刚才已经添加了,所以是有的。
那么,这句话就不成立了,&& 左边的是假,那么右边的就不执行了、
就是说:
dom.addClass(className)
这句话不执行了。
综合来看:
!dom.hasClass(className) && dom.addClass(className)
这个条件就是不成立的。
好的, || 左边的不成立,是不是说,我们无论如何都要执行一下||右边的代码呢?
恩, dom.removeClass(className) 就被执行了。
*请认真填写需求信息,我们会在24小时内与您取得联系。