巧用短路逻辑优化代码质量

来源:互联网 发布:网络三字经全文解释 编辑:程序博客网 时间:2024/06/05 08:08

1、我们首先来看一种数组去重的写法:

var arr=["a","b","a","c","a","b"];function unique1(arr){       for(var i =0,uarr=[];i<arr.length;i++){        for(var k =0;k<uarr.length;k++){                if(arr[i] == uarr[k]){                    break;                }               }        uarr[k]=arr[i];    }    return uarr;}console.log( unique1(arr) );

2、问自己一句:你觉得方法有问题吗?你可以优化吗?

3、稍有经验的人立马就会发现问题所在,但是对于当时还是新手的我来说,真的发现不了,而且别人给我讲了好几遍,才让我恍然大悟。其实问题就出在这句:

uarr[k]=arr[i];

因为如果arr[i]已经在uarr中有了,那么k一定小于uarr.length,uarr[k]=arr[i]代表覆盖,即会重新赋值一次,虽然最后的结果是一样的,但这样的代码质量不高。

4、很多人这个时候就会想到:那就在前面加一句条件判断:

if(k==uarr.length) {    (uarr[k]=arr[i]);}

工作中碰到的很多同事遇到类似的问题都是这样处理的,这本身并没有错,但其实我们还有一种更简单的方法——利用短路逻辑:
“&&” 如果前面为假,就不再执行后面的语句。
“||”如果前面为真,就不再执行后面的语句。
所以上面的那一段就可以直接写成:

    k==uarr.length && (uarr[k]=arr[i]);

5、可是很多人并不理解和接受这种直接明了的写法,那不如我们再举一例:

    if( response.status.conditions.length != 0 ){……}    

这样的写法是很多初入职场的人会写出来的逻辑判断,可是在运行中是会出问题的。如果response.status为undifined/none,那么response.status.conditions就会报错,于是有些人就会这么处理:

 if (response) {     if (response.status) {         if (response.status.conditions.length ) {             ……         }     } }

其实可以简写成:

if(response && response.status && response.status.conditions.length){    ……}

所以,我们在平时写代码时,巧用短路逻辑,可以优化代码质量。