欢迎进入教育资讯网!
当前页面: 首页 > 电脑IT培训 > Web前端 > 写好JS条件语句需要遵循的守则,这篇真的太可了!

写好JS条件语句需要遵循的守则,这篇真的太可了!

来源:教育资讯网 16 2021-07-27

  ***小编要跟大家分享的文章是关于Web前端写好JS条件语句需要遵循的守则。熟悉Web前端工作的小伙伴都知道在用JavaScript

  工作时,我们经常和条件语句打交道,***小编就为大家准备了5条让你写出好的,干净的条件语句的建议,下面让我们一起来看一看吧~

  1、多重判断时使用Array.includes

  让我们看一下下面这个例子:

  //condition

  functiontest(fruit){

  if(fruit=='apple'||fruit=='strawberry'){

  console.log('red');

  }

  }

  ***眼,上面这个例子看起来没问题。如果我们有更多名字叫cherry和cranberries的红色水果呢?我们准备用更多的||来拓展条件语句吗?

  我们可以用Array.includes(Array.includes)重写条件语句。

  functiontest(fruit){

  constredFruits=['apple','strawberry','cherry','cranberries'];

  if(redFruits.includes(fruit)){

  console.log('red');

  }

  }

  我们把红色的水果(redfruits)这一判断条件提取到一个数组。这样一来,代码看起来更整洁。

  2、更少的嵌套,尽早Return

  让我们拓展上一个例子让它包含两个条件。

  ·如果没有传入参数fruit,抛出错误

  ·接受quantity参数,并且在quantity大于10时打印出来

  functiontest(fruit,quantity){

  constredFruits=['apple','strawberry','cherry','cranberries'];

  //条件1:fruit必须有值

  if(fruit){

  //条件2:必须是red的

  if(redFruits.includes(fruit)){

  console.log('red');

  //条件3:quantity大于10

  if(quantity>10){

  console.log('bigquantity');

  }

  }

  }else{

  thrownewError('Nofruit!');

  }

  }

  //测试结果

  test(null);//error:Nofruits

  test('apple');//print:red

  test('apple',20);//print:red,bigquantity

  在上面的代码,我们有:

  ·1个if/else语句筛选出无效的语句

  ·3层if嵌套语句(条件1,2&3)

  我个人遵循的规则一般是在发现无效条件时,尽早Return。

  /_当发现无效语句时,尽早Return_/

  functiontest(fruit,quantity){

  constredFruits=['apple','strawberry','cherry','cranberries'];

  //条件1:尽早抛出错误

  if(!fruit)thrownewError('Nofruit!');

  //条件2:必须是红色的

  if(redFruits.includes(fruit)){

  console.log('red');

  //条件3:必须是大质量的

  if(quantity>10){

  console.log('bigquantity');

  }

  }

  }

  这样一来,我们少了一层嵌套语句。这种编码风格非常好,尤其是当你有很长的if语句的时候(想象你需要滚动到比较低层才知道还有else语句,这并不酷)

  我们可以通过倒置判断条件&尽早return进一步减少if嵌套。看下面我们是怎么处理判断条件2的:

  /_当发现无效语句时,尽早Return_/

  functiontest(fruit,quantity){

  constredFruits=['apple','strawberry','cherry','cranberries'];

  //条件1:尽早抛出错误

  if(!fruit)thrownewError('Nofruit!');

  //条件2:当水果不是红色时停止继续执行

  if(!redFruits.includes(fruit))return;

  console.log('red');

  //条件3:必须是大质量的

  if(quantity>10){

  console.log('bigquantity');

  }

  }

  通过倒置判断条件2,我们的代码避免了嵌套语句。这个技巧在我们需要进行很长的逻辑判断时是非常有用的,特别是我们希望能够在条件不满足时能够停止下来进行处理。

  而且这么做并不困难。问问自己,这个版本(没有嵌套)是不是比之前的(两层条件嵌套)更好,可读性更高?

  但对于我,我会保留先前的版本(包含两层嵌套)。这是因为:

  ·代码比较短且直接,包含if嵌套的更清晰

  ·倒置判断条件可能加重思考的负担(增加认知载荷)

  因此,应当尽力减少嵌套和尽早return,但不要过度。

  3、使用默认参数和解构

  我猜下面的代码你可能会熟悉,在JavaScript中我们总是需要检查null/undefined的值和指定默认值:

  functiontest(fruit,quantity){

  if(!fruit)return;

  //如果quantity参数没有传入,设置默认值为1

  constq=quantity||1;

  console.log(`Wehave${q}${fruit}!`);

  }

  //testresults

  test('banana');//Wehave1banana!

  test('apple',2);//Wehave2apple!

  实际上,我们可以通过声明默认函数参数来消除变量q。

  functiontest(fruit,quantity=1){

  //如果quantity参数没有传入,设置默认值为1

  if(!fruit)return;

  console.log(`Wehave${quantity}${fruit}!`);

  }

  //testresults

  test('banana');//Wehave1banana!

  test('apple',2);//Wehave2apple!

  这更加直观,不是吗?注意,每个声明都有自己的默认参数.

  例如,我们也能给fruit分配默认值:functiontest(fruit='unknown',quantity=1)。

  如果fruit是一个object会怎么样?我们能分配一个默认参数吗?

  functiontest(fruit){

  //当值存在时打印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

  //解构-**获取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或

  ull解构的的错误。因为在undefined中没有name属性。

  如果你不介意使用第三方库,这有一些方式减少null的检查:

  ·使用Lodashget函数

  ·使用Facebook开源的idx库(withBabeljs)

  这是一个使用Lodash的例子:

  functiontest(fruit){

  //获取属性名,如果属性名不可用,赋默认值为unknown

  console.log(__.get(fruit,'name','unknown');

  }

  //testresults

  test(undefined);//unknown

  test({});//unknown

  test({name:'apple',color:'red'});//apple

  你可以在jsbin运行demo代码。除此之外,如果你是函数式编程的粉丝,你可能选择使用Lodash

  fp,Lodash的函数式版本(方法变更为get或者getOr)。

  4、倾向于对象遍历而不是Switch语句

  让我们看下面这个例子,我们想根据color打印出水果:

  functiontest(color){

  //使用条件语句来寻找对应颜色的水果

  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规范之后实现的对象类型,允许你存储key和value的值。

  但我们是否应当禁止switch语句的使用呢?答案是不要限制你自己。从个人来说,我会尽可能的使用对象遍历,但我并不严格遵守它,而是使用对当前的场景更有意义的方式。

  ToddMotto有一篇关于switch语句对比对象遍历的更深入的文章,你可以在这个地方阅读

  TL;DR;重构语法

  在上面的例子,我们能够用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){

  returnfruits.filter(f=>f.color==color);

  }

  有着不止一种方法能够实现相同的结果,我们以上展示了4种。

  5、对所有/部分判断使用Array.every&Array.some

  这***一个建议更多是关于利用JavaScriptArray的内置方法来减少代码行数。看下面的代码,我们想要检查是否所有水果都是红色:

  constfruits=[

  {name:'apple',color:'red'},

  {name:'banana',color:'yellow'},

  {name:'grape',color:'purple'}

  ];

  functiontest(){

  letisAllRed=true;

  //条件:所有水果都是红色

  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(){

  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(){

  //条件:任何一个水果是红色

  constisAnyRed=fruits.some(f=>f.color=='red');

  console.log(isAnyRed);//true

  }

  6、总结

  让我们一起生产更多可读性高的代码。我希望你能从这篇文章学到东西。

  这就是所有的内容。编码快乐!

免责声明

非本网作品均来自互联网,转载目的在于传递更多信息,并不**本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其他问题,请及时与本网联系,我们将及时删除内容。

热点排行榜

教育部即将调整中小学上课时间,学生真的高兴坏了!
教育,是任何一个国家和民族的未来。如果没有了教育,那么这个国家和民族未来也会以前黑暗。随着知识在社会中的作用越来越大,人们也越来越重视教育。尤其是家长,为了能让孩子学习好,对于教育的投资可以说是不计代价!在许多人都越来越注重学习成绩的同时,孩子的学习压力却是越来越大,有的时候甚至孩子的睡眠时间都会严重不足。 如此一来虽然看似是孩子的学习成绩进步了,但是却严重影响了孩子的正常健康发育。如此
来看看在双减政策后,到底公立学校和私立学校有什么差距?
大部分的中小学生,都会选择在公立学校接受义务教育,但是随着教育“内卷”的情况越来越严重,不少学生家长会选择将孩子送到私立学校去上学,在这样的情况之下,中小学生的学习压力也越来越大,因此中小学生在上学的过程中,也会觉得非常疲惫。这种状态不*不利于学生们提高学习成绩,更不利于学生们成长,因此相关部门也是引起了高度重视。 随着“双减”政策的实行,学生们的学习压力也在逐渐减小,“双减”实行后,公
为了推行三胎,课本的封面也变成三胎了,来看看人社部怎么说的~
开学没几天,网络上就开始流传着热心家长们对语文课本的“新发现”:一年的时间,课本封面由二胎变成了三胎,妈妈也不打扮了,头发随便一扎,衣服还是去年那件,只是旧了。多了个娃,爸爸也不在家下棋了,估计为了养家加班挣钱去了。家长们口中的两个封面分别是统编语文教材五年级上册、六年级上册封面。这段“看图说话”因为贴近“三胎”的社会热点,迅速引发了众多网友的共鸣、转发。人民教育出版社在其公众号上进行了“辟谣”:
清华北大亚洲***排名来啦!泰晤士公布了2022世界大学排名结果!
综合报道,当地时间2日,泰晤士高等教育特刊(Times Higher Education,简称THE)更新了***2022年THE世界大学排名。中国高校排名再次上升,***有两所大学进入前20名,创下亚洲比较好纪录。根据新发布的排名,北大和清华并列第16名,这是***中国有两所大学进入前20名,也亚洲国家迄今为止的比较高排名。此外,中国内地共有10所大学进入前200名。根据排名,牛津大学连续6年位列***。美
怎么选择美国留学中介?选的时候一定要清醒!
此篇文章会把下面很多问题中的内容阐述的逻辑层次更简单分明一些,假使同学们如果没有太多时间,不妨粗略阅读下面的问题,大概了解下!我计划去美国留学入读硕士,想请教一下如何选择美国留学中介机构呢?美国留学中介选择策略:衡量自己的消费者心理选择美国留学中介机构请务必要依据你的需求进行相关选择。首先你需要询问自己,你申请是要干什么呢?这个问题就像是购买衣服和鞋,你买运动鞋,就不会去西装店。美国留学作为一个很
英语的单词怎么写才好看?学会这几个小习惯,你也能写的好看!
英语学习重视听说读写,其中的写作涉及标准的写作规范。以下是英语单词写法的介绍,供参考。1.倾斜。每个字母稍微向右倾斜,大约在5°~20°之间,但每个字母的倾斜必须一致,所以很漂亮。2.大写字母。大写字母都一样高,占上面的两个格子,顶部面向***条线。3.小写字母。中间一格小写字母a、c、e、m、n、o、r、s、u、v、w、x、z写在中间一格中,上下抵抗,但不及格。小写字母B、D、H、K、L上端顶**
乐读推出一年级20人在线小班:通过小班教学 建构积极有效的师生互动
随着全国各地中小学和幼儿园秋季开学时间的确定,幼小、初小衔接又成了热点话题,但究竟要如何“衔接”,并不是每位家长都有科学的认识。乐读20人在线小班面向一年级孩子,激发兴趣、培养习惯,希望科学有效地帮助孩子适应小学学习生活,实现从幼儿教育阶段到小学教育阶段的顺利过渡。从孩子喜闻乐见的事物入手,培养学习的兴趣小学生活泼好动,注意力持续时间短,不少孩子初入小学课堂可能会出现发呆、坐不住的情况。据此,家长
学而思网校的线下校区即将关闭,只因房租成本过高!
9月27日消息,据媒体报道,学而思老师群内告知家长,因运营成本过高,不足以支撑面授班运营,所有面授课转为在线班。并统一在10月9日中午12:00开启转线上功能。此外,多名学而思工作人员均表示线下校区将会关闭。业内人士指出,在高额的房租下,退租关店也许是**理智的做法。目前线下教培机构在节假日、休息日及寒暑假的营收能占到全年收入的一半以上,但是现在不让上课,商业模型该怎么搭,目前很多线下机构恐怕还没想
教育部又来消息了,以后这类竞赛要被管理了!速来看看!
9月23日,教育部举行新闻通气会,介绍规范校外培训机构管理制度建设有关情况。会上,教育部校外教育培训监管司负责人介绍,“双减”工作是一项长期性复杂性系统性的工程,必须注重当前和长远相统一,研究修订竞赛管理办法,将治理打着“国际”旗号的各类竞赛。教育部校外教育培训监管司负责人表示,加快预收费监管、加强培训机构党建等其他配套政策法规的制订进度。同时完善“营改非”流程,进一步明确过程中的公示期限、资产确
各大高校开学了,清华大学开学典礼的主题演讲走红了,这个主题真不错!
9月是开学季,很多人带着对大学的憧憬迈入校园。在清华大学开学典礼上,一段开学演讲走红。教师**梅赐琪没有讲成功,而是讲失败。在他看来,与成功相比,失败能带给人更多可能性。以下是演讲全文:首先请允许我**我的同事们向***(9月2日)入学的2021级同学们表示**热烈的祝贺!每一级的清华人都是特殊的,但是你们还是要更特殊一些。在人类和七种冠状病毒的遭遇之中,你们中的绝大多数见证了其中**危险的两次,一次懵