在使用JavaScript时,我们常常要写不少的条件语句。这里有五个小技巧,可以让你写出更干净,漂亮的条件语句。
举个栗子:
//条件语句 功能测试(水果){ 如果(水果=='苹果' | |水果==葺?{ console.log(红色); } }
乍一看,这么写似乎没什么大问题。然而,如果我们想要匹配更多的红色水果呢,比方说“樱桃”和“蔓越莓”?我们是不是得用更多的| |来扩展这条语句?
我们可以使用<代码> Array.includes (Array.includes) 代码>重写以上条件句。
功能测试(水果){//把条件提取到数组中 const redFruits=[‘苹果’,‘草莓’,“樱桃”,“小红莓”); 如果(redFruits.includes(水果)){ console.log(红色); } } >之前我们把红色的水果(条件)都提取到一个数组中,这使得我们的代码看起来更加整洁。
让我们为之前的例子添加两个条件:
如果没有提供水果,抛出错误。
如果该水果的数量大于10日将其打印出来。
功能测试(水果、数量){ const redFruits=[‘苹果’,‘草莓’,“樱桃”,“小红莓”);//条件1:水果必须有值 如果(水果){//条件2:必须为红色 如果(redFruits.includes(水果)){ console.log(红色);//条件3:必须是大量存在 如果(数量比;10){ 控制台。日志(“量大”); } } 其他}{ 把新的错误(“没有水果!”); } }//测试结果
引用>
测试(空);//报错:没有水果
测试(“苹果”);//打印:红色
测试(“苹果”,20);//打印:红、大数量
让我们来仔细看看上面的代码,我们有:
1个if/else语句来筛选无效的条件
3层如果语句嵌套(条件1,2,3)就我个人而言,我遵循的一个总的规则是当发现无效条件时尽早返回。
/_当发现无效条件时尽早返回_/功能测试(水果、数量){ const redFruits=[‘苹果’,‘草莓’,“樱桃”,“小红莓”);//条件1:尽早抛出错误 如果水果(!)把新的错误(“没有水果!”);//条件2:必须为红色 如果(redFruits.includes(水果)){ console.log(红色);//条件3:必须是大量存在 如果(数量比;10){ 控制台。日志(“量大”); } } }如此一来,我们就少写了一层嵌套。这是种很好的代码风格,尤其是在如果语句很长的时候(试想一下,你得滚动到底部才能知道那儿还有个其他语句,是不是有点不爽)。
如果反转一下条件,我们还可以进一步地减少嵌套层级。注意观察下面的条件2语句,看看是如何做到这点的:
/_当发现无效条件时尽早返回_/功能测试(水果、数量){ const redFruits=[‘苹果’,‘草莓’,“樱桃”,“小红莓”); 如果水果(!)把新的错误(“没有水果!”);//条件1:尽早抛出错误 如果(! redFruits.includes(水果))返回;//条件2:当水果不是红色的时候,直接返回 console.log(红色);//条件3:必须是大量存在 如果(数量比;10){ 控制台。日志(“量大”); } }通过反转条件2的条件,现在我们的代码已经没有嵌套了。当我们代码的逻辑链很长,并且希望当某个条件不满足时不再执行之后流程时,这个技巧会很好用。
然而,并没有任何硬性规则要求你这么做。这取决于你自己,对你而言,这个版本的代码(没有嵌套)是否要比之前那个版本(条件2有嵌套)的更好,可读性更强?
是我的话,我会选择前一个版本(条件2有嵌套)。原因在于:
这样的代码比较简短和直白,一个嵌套的如果使得结构更加清晰。
条件反转会导致更多的思考过程(增加认知负担)。因此,始终追求更少的嵌套,更早地返回,但是不要过度。感兴趣的话,这里有篇关于这个问题的文章以及StackOverflow上的讨论:
避免其他,返回早期蒂姆?奥克斯利
StackOverflow讨论> 功能测试(水果、数量){ 如果(水果)返回; const q=数量| | 1;//如果没有提供数量、默认为1 控制台。日志('我们有$ {q} ${水果}!”); }分享5个小技巧让你写出更好的JavaScript条件语句