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){
……
}
所以,我们在平时写代码时,巧用短路逻辑,可以优化代码质量。