当前位置: 首页 > 科技观察

您是否尝试过不使用if编写代码?_0

时间:2023-03-15 23:28:24 科技观察

译者注:尝试不写if的代码是很有趣的,而且,万一你明白什么是“数据就是代码,代码就是数据”?当我教新手编程时,我喜欢给他们一些小挑战,比如:在不使用if语句(或三元运算符、switch语句等)的情况下解决一些编程问题。这样做有什么意义吗?事实上,它可以迫使你从不同的角度来看待解决方案,也许会找到更好的方法。当然,使用if语句没有错。但是,不使用if有时可以增加代码的可读性。这不是绝对的,如果根本不用if语句,代码的可读性可能会更差。这就需要你根据不同的情况来判断了。此外,不使用if不仅会影响可读性。这背后隐藏着更深层次的道理。通过理解本文中的代码示例,您会发现如果不使用if语句,您的代码将更接近代码即数据的概念。此外,当你尝试不使用if语句进行编程时,这也是一件非常有趣的事情。示例1:计算数组中的奇数假设我们有一个整数数组arrayOfIntegers,现在我们需要计算其中奇数的个数:constarrayOfIntegers=[1,4,5,9,0,-1,5];使用ifletcounter=0;arrayOfIntegers.forEach((integer)=>{constremainder=Math.abs(integer%2);if(remainder===1){counter++;}});console.log(counter);控制台。日志(计数器);没有ifletcounter=0;arrayOfIntegers.forEach((整数)=>{constremainder=Math.abs(整数%2);counter+=remainder;});控制台日志(计数器);在不使用if的时候,我们巧妙地利用了偶数的odd和A的性质,即它们除以2的余数分别为0和1。示例2:判断是工作日还是周末给定一个日期(如newDate()),判断是工作日还是周末,分别返回“weekend”和“weekday”。使用ifconstweekendOrWeekday=(inputDate)=>{constday=inputDate.getDay();if(day===0||day===6){return'weekend';}return'weekday';//或者,forternaryfans://return(day===0||day===6)?'weekend':'weekday';};console.log(weekendOrWeekday(newDate()));没有ifconstweekendOrWeekday=(inputDate)=>{constday=inputDate.getDay();returnweekendOrWeekday.labels[day]||weekendOrWeekday.labels['default'];};weekendOrWeekday.labels={0:'weekend',6:'周末',默认:'工作日'};console.log(weekendOrWeekday(newDate()));有没有发现if语句里面其实隐藏了一些信息?它告诉我们哪一天是周末,哪一天是工作日。所以,为了摆脱if语句,我们只需要将这些信息写入weekendOrWeekday.labels对象并直接使用它。广告:如果您需要监控在线JavaScript代码错误,欢迎免费使用Fundebug!示例3:doubler函数编写一个doubler函数,根据参数的类型进行不同的运算:如果参数是一个数字,则将其乘以2(即5=>10,-10=>-20);如果参数是一个字符串,重复每个字符2次(即'hello'=>'hheello');如果参数是一个函数,调用它2次;如果参数是数组,则将每个元素作为参数,调用doubler函数。如果参数是对象,则将每个属性值作为参数,使用switchconstdoubler=(input)=>{switch(typeofinput){case'number':returninput+input;case'string'调用doubler函数:returninput.split('').map((letter)=>letter+letter).join('');case'object':Object.keys(input).map((key)=>(input[key]=doubler(input[key])));returninput;case'function':input();input();}};console.log(doubler(-10));console.log(doubler('嘿'));console.log(doubler([5,'hello']));console.log(doubler({a:5,b:'hello'}));console.log(doubler(function(){console.日志('呼叫我');});没有开关constdoubler=(input)=>{returndoubler.operationsByType[typeofinput](input);};doubler.operationsByType={number:(input)=>input+input,string:(input)=>input.split('').map((字母)=>字母+letter).join(''),函数:(input)=>{input();input();},object:(input)=>{Object.keys(input).map((key)=>(输入[key]=doubler(input[key])));returninput;},};可以看出,我将每个参数类型对应的操作都绑定到了doubler.operationsByType上,这样就可以不用switch语句实现doubler功能注:为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,转载仅供学习。