这些优化技巧可以避免我们在 JS 中过多的使用 IF 语句

接下来会介绍6种方式来代替 if 的使用,这样做不是坚决不使用 if 偏执狂,而是换个方式思考我们的编码思路。 2020-04-14 15:20:18 JSIF代码 PyTorch版EfficientDet比官方TF实现快25倍?这个GitHub项目数天狂揽千星 EfficientDet 难复现,复现即趟坑。在此 Github 项目中,开发者 zylo117 开源了 PyTorch 版本的 EfficientDet,速度比原版高 20 余倍。如今,该项目已经登上 Github Trending 热榜。

接下来会介绍6种方式来代替 if 的使用,这样做不是坚决不使用 if 偏执狂,而是换个方式思考我们的编码思路。

最近在重构代码时,我发现早期的代码使用太多的 if 语句,其程度是我从未见过的。这就是为什么我认为分享这些简单的技巧是非常重要的,这些技巧可以帮助我们避免过多的使用 if 语句。

接下来会介绍6种方式来代替 if 的使用,这样做不是坚决不使用 if 偏执狂,而是换个方式思考我们的编码思路。

[[322188]]

1. 三元运算符

(1) 事例1

带有IF的代码:

  1. functionsaveCustomer(customer){
  2. if(isCustomerValid(customer)){
  3. database.save(customer)
  4. }else{
  5. alert('customerisinvalid')
  6. }
  7. }

重构后代码:

  1. functionsaveCustomer(customer){
  2. returnisCustomerValid(customer)
  3. ?database.save(customer)
  4. :alert('customerisinvalid')
  5. }

使用 ES6

  1. constsaveCustomer=customer=>
  2. isCustomerValid(customer)?
  3. database.save(customer):alert('customerisinvalid')

(2) 事例2

带有IF的代码:

  1. functioncustomerValidation(customer){
  2. if(!customer.email){
  3. returnerror('emailisrequire')
  4. }elseif(!customer.login){
  5. returnerror('loginisrequired')
  6. }elseif(!customer.name){
  7. returnerror('nameisrequired')
  8. }else{
  9. returncustomer
  10. }
  11. }

重构后代码:

  1. constcustomercustomerValidation=customer=>
  2. !customer.email?error('emailisrequired')
  3. :!customer.login?error('loginisrequired')
  4. :!customer.name?error('nameisrequired')
  5. :customer

(3) 事例3

带有IF的代码:

  1. functiongetEventTarget(evt){
  2. if(!evt){
  3. evt=window.event;
  4. }
  5. if(!evt){
  6. return;
  7. }
  8. consttarget;
  9. if(evt.target){
  10. target=evt.target;
  11. }else{
  12. target=evt.srcElement;
  13. }
  14. returntarget;
  15. }

重构后代码:

  1. functiongetEventTarget(evt){
  2. evtevt=evt||window.event;
  3. returnevt&&(evt.target||evt.srcElement);
  4. }

2. 短路运算符

(1) 事例1

带有IF的代码:

  1. constisOnline=true;
  2. constmakeReservation=()=>{};
  3. constuser={
  4. name:'Damian',
  5. age:32,
  6. dni:33295000
  7. };
  8. if(isOnline){
  9. makeReservation(user);
  10. }

重构后代码:

  1. constisOnline=true;
  2. constmakeReservation=()=>{};
  3. constuser={
  4. name:'Damian',
  5. age:32,
  6. dni:33295000
  7. };
  8. isOnline&&makeReservation(user);

(2) 事例2

带有IF的代码:

  1. constactive=true;
  2. constloan={
  3. uuid:123456,
  4. ammount:10,
  5. requestedBy:'rick'
  6. };
  7. constsendMoney=()=>{};
  8. if(active&&loan){
  9. sendMoney();
  10. }

重构后代码:

  1. constactive=true;
  2. constloan={
  3. uuid:123456,
  4. ammount:10,
  5. requestedBy:'rick'
  6. };
  7. constsendMoney=()=>{};
  8. ctive&&loan&&sendMoney();

3. 函数委托

事例1

带有IF的代码:

  1. functionitemDropped(item,location){
  2. if(!item){
  3. returnfalse;
  4. }elseif(outOfBounds(location){
  5. varerror=outOfBounds;
  6. server.notify(item,error);
  7. items.resetAll();
  8. returnfalse;
  9. }else{
  10. animateCanvas();
  11. server.notify(item,location);
  12. returntrue;
  13. }

重构后代码:

  1. functionitemDropped(item,location){
  2. constdropOut=function(){
  3. server.notify(item,outOfBounds);
  4. items.resetAll();
  5. returnfalse;
  6. }
  7. constdropIn=function(){
  8. server.notify(item,location);
  9. animateCanvas();
  10. returntrue;
  11. }
  12. return!!item&&(outOfBounds(location)?dropOut():dropIn());
  13. }

4. 非分支策略

此技巧尝试避免使用switch语句,相反是用键/值创建一个映射并使用一个函数访问作为参数传递的键的值。

(1) 事例1

带有switch的代码:

  1. switch(breed){
  2. case'border':
  3. return'BorderColliesaregoodboysandgirls.';
  4. break;
  5. case'pitbull':
  6. return'PitBullsaregoodboysandgirls.';
  7. break;
  8. case'german':
  9. return'GermanShepherdsaregoodboysandgirls.';
  10. break;
  11. default:
  12. return'Imdefault'
  13. }

重构后代码:

  1. constdogSwitch=(breed)=>({
  2. "border":"BorderColliesaregoodboysandgirls.",
  3. "pitbull":"PitBullsaregoodboysandgirls.",
  4. "german":"GermanShepherdsaregoodboysandgirls.",
  5. })[breed]||'Imthedefault';
  6. dogSwitch("borderxxx")

5. 作为数据的函数

我们知道在JS中函数是第一个类,所以使用它我们可以把代码分割成一个函数对象。

带有IF的代码:

  1. constcalc={
  2. run:function(op,n1,n2){
  3. constresult;
  4. if(op=="add"){
  5. result=n1+n2;
  6. }elseif(op=="sub"){
  7. result=n1-n2;
  8. }elseif(op=="mult"){
  9. result=n1*n2;
  10. }elseif(op=="div"){
  11. result=n1/n2;
  12. }
  13. returnresult;
  14. }
  15. }
  16. calc.run("sub",5,3);//2

重构后代码:

  1. constcalc={
  2. add:function(a,b){
  3. returna+b;
  4. },
  5. sub:function(a,b){
  6. returna-b;
  7. },
  8. mult:function(a,b){
  9. returna*b;
  10. },
  11. div:function(a,b){
  12. returna/b;
  13. },
  14. run:function(fn,a,b){
  15. returnfn&&fn(a,b);
  16. }
  17. }
  18. calc.run(calc.mult,7,4);//28

6. 多态性

多态性是对象具有多种形式的能力。OOP中多态性最常见的用法是使用父类引用来引用子类对象。

带有IF的代码:

  1. constbob={
  2. name:'Bob',
  3. salary:1000,
  4. job_type:'DEVELOPER'
  5. };
  6. constmary={
  7. name:'Mary',
  8. salary:1000,
  9. job_type:'QA'
  10. };
  11. constcalc=(person)=>{
  12. if(people.job_type==='DEVELOPER')
  13. returnperson.salary+9000*0.10;
  14. if(people.job_type==='QA')
  15. returnperson.salary+1000*0.60;
  16. }
  17. console.log('Salary',calc(bob));
  18. console.log('Salary',calc(mary));

重构后代码:

  1. constqaSalary=(base)=>base+9000*0.10;
  2. constdevSalary=(base)=>base+1000*0.60;
  3. //Addfunctiontotheobject.
  4. constbob={
  5. name:'Bob',
  6. salary:1000,
  7. job_type:'DEVELOPER',
  8. calc:devSalary
  9. };
  10. constmary={
  11. name:'Mary',
  12. salary:1000,
  13. job_type:'QA',
  14. calc:qaSalary
  15. };
  16. console.log('Salary',bob.calc(bob.salary));
  17. console.log('Salary',mary.calc(mary.salary));

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月5日 10:35
下一篇 2023年5月5日 10:35

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信