JavaScript中条件语句的优化技巧总结
对多个条件使用Array.includes
functiontest(fruit){
if(fruit=='apple'||fruit=='strawberry'){
console.log('red');
}
}
上面的例子看起来不错。然而,如果还有更多红颜色的水果需要判断呢,比如樱桃和小红莓,我们要用更多的||来扩展这个表述吗?
我们可以用Array.includes重写上面的条件!
functiontest(fruit){
constredFruits=['apple','strawberry','cherry','cranberries'];
if(redFruits.includes(fruit)){
console.log('red');
}
}
我们将条件提取到一个数组中。这样做之后,代码看起来更整洁。
更少的嵌套,尽早返回
扩展前面的示例,以包含另外两个条件:
如果没有提供水果(名称),抛出错误。
如果(红色水果)数量超过10个,接受并打印。
看看上面的代码,我们有:
1组过滤无效条件的if/else语句
3层的if嵌套语句(条件1、2和3)
遵循的一般规则是,当发现无效条件时,提前返回。
/_returnearlywheninvalidconditionsfound_/
functiontest(fruit,quantity){
constredFruits=['apple','strawberry','cherry','cranberries'];
//condition1:throwerrorearly
if(!fruit)thrownewError('Nofruit!');
//condition2:mustbered
if(redFruits.includes(fruit)){
console.log('red');
//condition3:mustbebigquantity
if(quantity>10){
console.log('bigquantity');
}
}
}
这样,我们就少了一层嵌套。这种编码风格很好,尤其是当你有很长的if语句时(想象一下,你需要滚动到最底部才能知道还有一个else语句,这并不好)。
通过反转条件和提早返回,我们可以进一步减少嵌套。看看下面的条件2,我们是怎么做的:
/_returnearlywheninvalidconditionsfound_/
functiontest(fruit,quantity){
constredFruits=['apple','strawberry','cherry','cranberries'];
if(!fruit)thrownewError('Nofruit!');//condition1:throwerrorearly
if(!redFruits.includes(fruit))return;//condition2:stopwhenfruitisnotred
console.log('red');
//condition3:mustbebigquantity
if(quantity>10){
console.log('bigquantity');
}
}
通过反转条件2的条件,我们的代码现在没有嵌套语句。当我们有很长的逻辑要处理时,这种技术是有用的,当一个条件没有满足时,我们想要停止进一步的处理。
然而,这并不是严格的规则。问问自己,这个版本(没有嵌套)是否比前一个版本(嵌套的条件2)更好、更易读?
对于我来说,我将把它保留为以前的版本(条件2和嵌套)。这是因为:
代码简短而直接,如果嵌套,代码就更清晰了,反转条件可能会导致更多的思考过程(增加认知负担)!
因此,总是以更少的嵌套及尽早返回为目标,但不要过度。
使用默认的函数参数和解构
在使用JavaScript时总是需要检查null或undefined值并分配默认值:
functiontest(fruit,quantity){
if(!fruit)return;
constq=quantity||1;
}
//testresults
test('banana');
test('apple',2);
事实上,可以通过指定默认的函数参数来消除变量q。
functiontest(fruit,quantity=1){
if(!fruit)return;
}
//testresults
test('banana');
test('apple',2);
请注意,每个参数都可以有自己的默认函数参数。例如,我们也可以为fruit赋值:functiontest(fruit='unknown',quantity=1)。
如果我们的fruit是一个对象:
functiontest(fruit){
if(fruit&&fruit.name){
console.log(fruit.name);
}else{
console.log('unknown');
}
}
//testresults
test(undefined);//unknown
test({});//unknown
test({name:'apple',color:'red'});//apple
如果fruit.name是可用的,我们将打印该水果名称,否则我们将打印unknown。我们可以避免使用与默认函数参数和解构对条件fruit&&fruit.name进行检查。
functiontest({name}={}){
console.log(name||'unknown');
}
//testresults
test(undefined);//unknown
test({});//unknown
test({name:'apple',color:'red'});//apple
因为我们只需要水果中的属性name,所以我们可以使用{name}来解构,然后我们可以在代码中使用name作为变量,而不是fruit.name。
我们还将空对象{}指定为默认值。如果我们不这样做,当执行test(undefined),不能解构undefined或null的属性名时,您将会得到错误。因为在undefined中没有name属性。
选择Map或对象字面量,而不是Switch语句
我们想要基于颜色打印水果名称:
functiontest(color){
//useswitchcasetofindfruitsincolor
switch(color){
case'red':
return['apple','strawberry'];
case'yellow':
return['banana','pineapple'];
case'purple':
return['grape','plum'];
default:
return[];
}
}
//testresults
test(null);//[]
test('yellow');//['banana','pineapple']
上面的代码似乎没有什么问题,但发现它相当冗长。同样的结果可以通过对象字面量和更简洁的语法来实现:
constfruitColor={
red:['apple','strawberry'],
yellow:['banana','pineapple'],
purple:['grape','plum']
};
functiontest(color){
returnfruitColor[color]||[];
}
或者,可以使用Map来实现相同的结果:
constfruitColor=newMap()
.set('red',['apple','strawberry'])
.set('yellow',['banana','pineapple'])
.set('purple',['grape','plum']);
functiontest(color){
returnfruitColor.get(color)||[];
}
Map是ES2015以后可用的对象类型,允许您存储键值对。
对于上面的示例,我们实际上可以重构代码,以使用Array.filter获得相同的结果。
constfruits=[
{name:'apple',color:'red'},
{name:'strawberry',color:'red'},
{name:'banana',color:'yellow'},
{name:'pineapple',color:'yellow'},
{name:'grape',color:'purple'},
{name:'plum',color:'purple'}
];
functiontest(color){
//useArrayfiltertofindfruitsincolor
returnfruits.filter(f=>f.color==color);
}
总有不止一种方法可以达到同样的效果。展示了4个相同效果的例子。
所有或部分使用Array.every&Array.some的条件
使用新的Javascript数组函数来减少代码行。看看下面的代码,我们想检查所有的水果是否都是红色的:
constfruits=[
{name:'apple',color:'red'},
{name:'banana',color:'yellow'},
{name:'grape',color:'purple'}
];
functiontest(){
letisAllRed=true;
//condition:allfruitsmustbered
for(letfoffruits){
if(!isAllRed)break;
isAllRed=(f.color=='red');
}
console.log(isAllRed);//false
}
代码太长了!我们可以用Array.every来减少行数:
constfruits=[
{name:'apple',color:'red'},
{name:'banana',color:'yellow'},
{name:'grape',color:'purple'}
];
functiontest(){
//condition:shortway,allfruitsmustbered
constisAllRed=fruits.every(f=>f.color=='red');
console.log(isAllRed);//false
}
现在干净多了,对吧?类似地,如果我们想用一行代码来判断任何一个水果是否为红色,我们可以使用Array.some。
constfruits=[
{name:'apple',color:'red'},
{name:'banana',color:'yellow'},
{name:'grape',color:'purple'}
];
functiontest(){
//condition:ifanyfruitisred
constisAnyRed=fruits.some(f=>f.color=='red');
console.log(isAnyRed);//true
}
到此这篇关于JavaScript中条件语句的优化技巧的文章就介绍到这了,更多相关JS条件语句优化技巧内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
