你试过不用if撸代码吗?

译者按: 试着不用if撸代码,是件很有趣的事,而且,万一你领会了什么是“数据即代码,代码即数据”呢?

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

我在教新手编程时,喜欢给他们一些小小的挑战,比如:不使用if语句(或者三元运算符、switch语句等)解决一些编程问题。

这样做有什么意义吗?

事实上,它可以迫使你从不同的角度寻找解决方法,也许可以找到更好的方法。

当然,使用if语句没有任何不对的地方。但是,不使用if的话,有时候可以增加代码的可读性。这一点并不是绝对的,如果完全不使用if语句的话,代码可读性也许会更差。这需要你根据不同情况去判断。

而且,不用if的话不只是影响可读性。在这背后隐含着更加深刻的道理。通过了解本文的代码示例,你可以发现,如果不使用if语句的话,你的代码会更加接近代码即数据的概念。

另外,当你尝试不使用if语句去编程时,也是一件非常有意思的事情。

示例1: 统计数组中的奇数

假设我们有一个整数数组arrayOfIntegers,现在需要统计其中奇数的个数:


const arrayOfIntegers = [1, 4, 5, 9, 0, -1, 5];

使用if


let counter = 0;

arrayOfIntegers.forEach((integer) => {

const remainder = Math.abs(integer % 2);

if (remainder === 1) {

counter++;

}

});

console.log(counter);

不用if


let counter = 0;

arrayOfIntegers.forEach((integer) => {

const remainder = Math.abs(integer % 2);

counter += remainder;

});

console.log(counter);

不用if时,我们巧妙地利用了奇数与偶数的特性,它们除以2的余数分别是0和1。

示例2: 判断工作日和周末

给定一个日期(比如new Date()),判断它是工作日还是周末,分别返回”weekend”和”weekday”。

使用if


const weekendOrWeekday = (inputDate) => {

const day = inputDate.getDay();

if (day === 0 || day === 6) {

return ‘weekend‘;

}

return ‘weekday‘;

// Or, for ternary fans:

// return (day === 0 || day === 6) ? ‘weekend‘ : ‘weekday‘;

};

console.log(weekendOrWeekday(new Date()));

不用if


const weekendOrWeekday = (inputDate) => {

const day = inputDate.getDay();

return weekendOrWeekday.labels[day] ||

weekendOrWeekday.labels[‘default‘];

};

weekendOrWeekday.labels = {

0: ‘weekend‘,

6: ‘weekend‘,

default: ‘weekday‘

};

console.log(weekendOrWeekday(new Date()));

你是否发现if语句中其实隐含着一些信息呢?它告诉我们哪一天是周末,哪一天是工作日。因此,要去掉if语句的话,我们只需要把这些信息写入weekendOrWeekday.labels对象,然后直接使用它就好了。

广告: 如果你需要监控线上JavaScript代码的错误的话,欢迎免费使用Fundebug!

示例3: doubler函数

写一个doubler函数,它会根据参数的类型,进行不同的操作:

  • 如果参数是数字,则乘以2(i.e. 5 => 10-10 => -20);
  • 如果参数是字符串,则每个字符重复2次 (i.e. ‘hello‘ => ‘hheelloo‘);
  • 如果参数是函数,则调用2次;
  • 如果参数是数组,则将每一个元素作为参数,调用doubler函数
  • 如果参数是对象,则将每个属性值作为参数,调用doubler函数

使用switch


const doubler = (input) => {

switch (typeof input) {

case ‘number‘:

return input + input;

case ‘string‘:

return input

.split(‘‘)

.map((letter) => letter + letter)

.join(‘‘);

case ‘object‘:

Object.keys(input)

.map((key) => (input[key] = doubler(input[key])));

return input;

case ‘function‘:

input();

input();

}

};

console.log(doubler(-10));

console.log(doubler(‘hey‘));

console.log(doubler([5, ‘hello‘]));

console.log(doubler({ a: 5, b: ‘hello‘ }));

console.log(

doubler(function() {

console.log(‘call-me‘);

}),

);

不用switch


const doubler = (input) => {

return doubler.operationsByType[typeof input](input);

};

doubler.operationsByType = {

number: (input) => input + input,

string: (input) =>

input

.split(‘‘)

.map((letter) => letter + letter)

.join(‘‘),

function: (input) => {

input();

input();

},

object: (input) => {

Object.keys(input)

.map((key) => (input[key] = doubler(input[key])));

return input;

},

};

console.log(doubler(-10));

console.log(doubler(‘hey‘));

console.log(doubler([5, ‘hello‘]));

console.log(doubler({ a: 5, b: ‘hello‘ }));

console.log(

doubler(function() {

console.log(‘call-me‘);

}),

);

可知,我将每一种参数类型对应的操作绑定到了doubler.operationsByType,这样不需要switch语句,就可以实现doubler函数了。

版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/11/06/write-javascript-without-if/
时间: 2024-10-08 09:20:37

你试过不用if撸代码吗?的相关文章

你试过不用if写代码吗?

我在教新手编程时,喜欢给他们一些小小的挑战,比如:不使用if语句(或者三元运算符.switch语句等)解决一些编程问题.这样做有什么意义吗?事实上,它可以迫使你从不同的角度寻找解决方法,也许可以找到更好的方法. 正文共:2799 字 预计阅读时间:7 分钟 我在教新手编程时,喜欢给他们一些小小的挑战,比如:不使用if语句(或者三元运算符.switch语句等)解决一些编程问题. 这样做有什么意义吗? 事实上,它可以迫使你从不同的角度寻找解决方法,也许可以找到更好的方法. 当然,使用if语句没有任何

七夕节不撸代码你好意思说自己是程序猿

七夕节不撸代码你好意思说自己是程序猿 好吧,已经打了一天的包,上午匆匆打完之后放在fir上面结果还以为今天会能轻松一天,谁知道造化弄人,硬是安装不了,没有办法我以为是自己加了push导致的,全部删了自己生成的证书,重新开始,唉!对方有时时刻刻的催促着我拿包来,真是压力山大,说好上午的包呢中午还在继续来来回回的尝试着,一直以为是证书问题,没有办法自己又重新建立了新的dis证书(心急中建立的,真想把什么都删了一切重来) 整整一个中午都是在失败和催促中进行中,更可恶的是apple后台进不去,真尼玛崩了

PM撸代码之Android【武侠篇:封装、继承、多态】

80 PM撸代码之Android[武侠篇:封装.继承.多态] 这是Android系列的第六篇文章,在之前的一篇文章中,已经了解了面向对象的基础概念,这一篇将会通过武侠江湖的类比,讲解面向对象的更多内容,感谢小伙伴们一直以来的支持. 武林门派的三个特征 1 独门秘籍(封装) 2 传承的门派(继承) 3 看情况使功夫和换个姿势说明问题(多态) [封装] 1 门派独门秘籍(封装) 前一篇已经说到,当达摩上了嵩山以后,江湖就正式进入门派时代.每个门派区别于其他门派,肯定是因为这个门派拥有独门武功秘籍.举

PM撸代码之Android【绝顶高手排行榜】

82 PM撸代码之Android[绝顶高手排行榜] 这是Android系列的第七篇文章了,也是关于Java语言的最后一篇文章了.这一篇后,我们将正式开始Android的学习.不过这一篇大家还是要好好地学一下,把Java的基础打好,那么学Android将会事半功倍的. 不久前,公众号的文章已经突破20万字了,我还是挺高兴的,一共发了80多篇文章了.规划中的文章还有很多,希望我能一直写下去吧,没有你们的支持,我是不可能有动力码那么多字的.接下来也不会一直发布Android的教程,而是会穿插地发表文章

IOS APP 国际化(实现不跟随系统语言,不用重启应用,代码切换stroyboard ,xib ,图片,其他资源)

接了个变态的需求,要在程序内切换程序语言实现国际化. 可以先看看这个,比较详细. http://blog.csdn.net/xwren362922604/article/details/17190061 看完之后问题来了, 1,工程里面大量的 xib  或 storyboard 里面的UI 设定了text ,怎么实现让它们动态加载语言[非设置系统语言重启] 2,一个简单的思路,当代码触发切换语言 发个通知让 内存里的viewController 刷新UI的text .[工程里这么都vc 每个都加

为何你跟着滴滴D8级前端大神撸代码,技术却依旧原地踏步?

引子 听说最近有很多小伙伴,热衷于在慕课网上学习各种前端实战教程,并以完成项目为奋斗目标.比如本文接下来要提到的<Vue2.0高级实战之开发移动端音乐App>,这门课程的传授者是来自滴滴D8级的前端大神黄轶,当然也是我推崇的行业偶像之一. 在这里既然提到了Vue这门渐进式的前端框架,我就不得不感慨一下,最近两年,Vue.js在国内的发展可谓是如日中天,红透大江南北(当然功劳也少不了尤雨溪前段时间在上海,北京的演讲,为之宣传布道). 光我从掘金,简书,GitHub等平台上看到的相关文章或个人项目

七夕节不撸代码你好意思说自己是程序员

七夕节不撸代码你好意思说自己是程序员 好吧.已经打了一天的包,上午匆匆打完之后放在fir上面结果还以为今天会能轻松一天,谁知道造化弄人.硬是安装不了,没有办法我以为是自己加了push导致的,所有删了自己生成的证书,又一次開始,唉.对方有时时刻刻的催促着我拿包来,真是压力山大,说好上午的包呢中午还在继续来来回回的尝试着.一直以为是证书问题,没有办法自己又又一次建立了新的dis证书(心急中建立的.真想把什么都删了一切重来) 整整一个中午都是在失败和催促中进行中,更可恶的是apple后台进不去,真尼玛

撸代码

今天一整天除了工作以外,一直都在默默的根据Pro ASP.NET Core MVC2撸代码. 越撸越感觉对asp.net core相见恨晚.当然,现在也不算迟.接下来还要继续多去了解python.golang.java等等.了解得越多,越觉得自己无知.何时才能征服宇宙? 今日get: 标签助手:C# 逻辑引入视图的最有效的方法之一.标签助手的代码看起来很痛苦,因为 C# 和 HTML 不容易混合.但是使用标签助手比在视图中包含 C# 代码块更可取,因为标签助手可以很容易地进行单元测试. 原文地址

iOS开发:集成支付宝(遇见的坑和便捷撸代码)

开发iOS最重要的就是支付了,天朝之内最常用的就是支付宝了,下面就以自己的经历说明如何集成支付宝+遇见的坑. 首先,集成支付宝最好别使用Cocoapods,很多人都说使用起来很方便,可是我每次只要使用Cocoapods导入支付宝SDK,总是出现各种莫名其妙的错误,并且还每次都不一样,最终,我只能手动导入. 其实可以使用ping++和其他更为方便.如 http://winann.blog.51cto.com/4424329/1601654 https://www.pingxx.com/ 以自己集成