JS条件判断技巧(一)

发布时间:2025-04-30浏览:73

提前返回,少用if...else

《if.else 是编程语言的精髓。—— 鲁迅》 但过多的嵌套还是挺让人沮丧的。这是一个非常典型的条件嵌套:

函数func(){ var 结果; if( 条件A ) { if( 条件B ) { 结果='成功'; } else { 结果='错误1'; } } else { result='Error2' } return result;}这种嵌入嵌套的特点是else中的代码块很小,但是必须要做的分支语句导致多层嵌套。开动你的大脑,怎样才能简化它呢?在if中做非判断——条件反转,通过guard语句提前返回else分支。

function func(){ if( !conditionA ) { return 'Error2' } if( !conditionB ) { return 'Error1' } return 'Success';}

forEach优化

多条件,用Array.includes

再比如某个页面需要验证输入类型合法吗?我收到一位先生曾经写过这篇文章。

const init(type) { if( type==='研讨会' || type==='面试' ) { console.log('valid'); } . console.error('invalide');} if 合法类型只有两种,实际上代码没有任何问题。只是一般业务以后很容易扩展。如果以后合法类型增加到10种,上面的代码就会是一长串if判断。这种代码极不可读。我们不妨换个思路,将非法类型存储在数组中,用Array.includes来帮你完成冗长的判断。每次添加新类型时,只需在数组后面附加一个新字符串即可。

const init(type) { const invalidArray=['研讨会', '面试'] if( invalidArray.includes(type) ) { console.log('valid'); } } .}

使用object索引

类似的情况也发生在三元表达式: 中

const dateFormat=(dateTime)={ const format=this.$i18n.locale==='en' ? 'mmm d, yyyy' : 'yyyy m 月d 日'; return DateFormat(dateTime, format);}us 现阶段多语言仅支持en 和zh。上面的代码自然是没有问题的,但是不保证有一天会支持日语——ja。这个时候,写出下面的代码就很搞笑了:

const 格式=this.$i18n.locale==='en' ? 'mmm d, yyyy' : (this.$i18n.locale==='zh' ? 'yyyyyear m 月d 日' : 'yyyy/m /d');更合适的写法是使用对象键索引,这样当语言业务扩展时,只需要在localeFormats后面追加新的格式即可。

const localeFormats={ en: 'mmm d, yyyy', zh: 'yyyyyyyyyyyyyyyyyyyyy/m/d',}const format=localeFormats[this.$i18n.locale];

尽量少用swith

长Switch也极其丑陋。

导出函数(类型){ switch(类型){ case 'Onion': return func1(); case '大蒜': return func2(); case 'Ginger': return func3(); default: return ()={console.error('ERROR')};我记得OOP设计模式里有提到:尽量使用多态和继承,而不是Switch结构。在JS中你不需要考虑这个。使用Object 或Map 索引代替Switch 也很棒!

const arr=[ ['洋葱', func1], ['大蒜', func2], ['姜', func3],] const def=()={console.error('ERROR')}const Vegetable=new Map (arr);export function(type) { return ( Vegetable.get(type) || def ).call(null);}

Optional Chaining

可选链接(Optional Chaining,以下简称OC)是我强烈推荐的语法糖。我写了一个issue 《Javascript Optional Chaining》来详细介绍它的用法。有兴趣的朋友可以看一下,点击这里。例如,我们想要获取地址中的街道信息,但我们不确定该地址本身是否存在。因此,我们只能在获取街道之前判断地址的合法性。一般我们会这样写:

if(address) { var street=address.street;} 但是如果还有一层怎么办,从basicInfo.address.street 中找到它怎么样?

if( basicInfo ) { var 地址=basicInfo.address; if( 地址) { var 街道=地址. 街道;我已经觉得上面的代码很丑了,而且我无法忍受更多的层。不过不用担心,有了OC一切都会解决。 (虽然OC还处于ECMAScript stage 2,但是你可以使用babel来尝试一下;babel会自动将下面的源代码转义为上面的形式)

var street=basicInfo?address?street;

写在最后

我自学了几种编程语言,感觉这些技巧在各种语言中都差不多;实现上可能略有不同,但基本思想是相同的—— 减少了大括号的数量!在面试过程中,我经常看到人们编写非常冗长的代码,并且有很多嵌套。经过我提醒,得到的回复通常是:“我从来没有做过这样的采访”,“我熟悉另一种语言”等等。回头想想,这真的是一个很好的理由吗?

用户评论

虚伪了的真心

感觉这篇文章写的挺清晰易懂啊,我之前一直用if else那种方式判断条件,后来才知道有这种更简洁的方法!

    有16位网友表示赞同!

微信名字

终于看到一篇实用的JavaScript文章了!我一直觉得条件判断写代码太麻烦了,这个小技巧简直是福音啊. 学习学习...

    有12位网友表示赞同!

你的眸中有星辰

我总感觉这篇文章有点浅显,像这种简单的条件判断应该在教材上都教了吧?

    有10位网友表示赞同!

醉婉笙歌

看完这篇博客的“零级条件判断”,感觉自己可以写更优雅的代码了!感谢分享这个小技巧,我已经开始尝试在项目中使用了!

    有11位网友表示赞同!

無極卍盜

这个方法确实挺简洁的,但在调试的时候可能会带来些麻烦。毕竟直接看懂代码比较困难...

    有10位网友表示赞同!

一尾流莺

我觉得这种短路判断的写法还是比较好理解的。关键是不需要多余的if else,代码整洁简洁。

    有12位网友表示赞同!

别留遗憾

这篇文章介绍的技巧确实很棒,让我对JavaScript条件判断有了更深入的理解!

    有14位网友表示赞同!

青衫负雪

这篇文章说的很到位,我之前总是用传统的if else语句进行条件判断,现在明白了这个方法可以更高效地处理条件逻辑!

    有9位网友表示赞同!

苏樱凉

我觉得这种小技巧对于初学者可能有点难度,还需要多加练习才能熟练掌握。

    有8位网友表示赞同!

抚涟i

写得不错啊!我一直觉得JavaScript的条件判断不太好理解,看了你的文章感觉豁然开朗了。期待后面的篇章更新呀!

    有20位网友表示赞同!

仅有的余温

这篇文章让我明白为什么零级条件判断在性能方面更加优秀,原来是它避免了一些不必要的代码执行!真的很棒!

    有16位网友表示赞同!

单身i

希望后续的文章能介绍一些更高级的JavaScript条件判断技巧吧,比如switch语句的使用和嵌套判断。期待分享!

    有20位网友表示赞同!

逾期不候

这篇文章的重点应该放在零级条件判断的优缺点上,分析哪些情况下更适用这种方法,会更有参考价值。

    有8位网友表示赞同!

追忆思域。

终于明白了JS条件判断的小技巧了!之前一直觉得JavaScript写代码太复杂,现在学会了你这个方法,感觉好多了!

    有19位网友表示赞同!

经典的对白

这篇博文真的很有帮助,让我重新认识了JavaScript条件判断的运用。原来条件判断可以这么简洁高效!

    有19位网友表示赞同!

旧事酒浓

这种学习方式我喜欢!点到为止,不废话,很实用!

    有13位网友表示赞同!

淡写薰衣草的香

个人觉得这个技巧对于初学者来说有点抽象,还是需要结合实际场景进行讲解才能更好地理解。

    有14位网友表示赞同!

予之欢颜

希望后续文章能分享更多关于JavaScript条件判断的知识和技巧,比如使用函数和闭包实现更灵活的条件判断!

    有9位网友表示赞同!

热点资讯