你试过不用if撸代码吗?

640?wx_fmt=gif


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


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


这样做有什么意义吗?


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

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


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


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


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


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


const arrayOfIntegers = [14590-15];


使用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({ a5b'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函数了。


来源:Fundedbug博客

链接:https://blog.fundebug.com/2017/11/06/write-javascript-without-if/

原文:https://medium.com/@samerbuna/coding-tip-try-to-code-without-if-statements-d06799eed231

版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。


数据与算法之美

用数据解决不可能


640?wx_fmt=jpeg

长按扫码关注


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NET问答: 对 Linq 中的 Union 和 Concat 的用法困惑

咨询区 Prasad Kanaparthi:我在使用 Union 和 Concat 上有一个困惑,从字面上理解:一个是并集,一个是连接,下面的例子就是我对这两个扩展方法的理解。static void Main(string[] args){var a1 (new[] { 1, 2 }).Union(…

中止是怎么用的_多士炉怎么用 使用多士炉注意事项

阅读本文前,请您先点击上面的蓝色字体,再点击“关注”,这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅,请放心关注。 …

国内 GitHub 造假黑色产业链曝光;开源开发者撤销对 ICE 禁用的决定

0、国内 GitHub 被爆造假,起底背后的黑色产业链作为全球最大的开源社区,GitHub 对于程序员群体而言像是空气般重要的存在,而互联网公司也会通过 GitHub 来进一步了解面试者的编程习惯,技术水平等。但最近知乎上有一篇《中国内地 G…

Azure data studio 跨平台数据库管理工具试用

最近折腾 azure sql database 的时候发现了微软的一款新的数据库管理工具:azure data studio。从名字上看 azure data studio 好像是专门为 azure 开发的,其实并不是这样的 。它同样支持对传统sql server的查询与管理。azure data studio 是一款跨平台数…

顺丰gis产品经理_线上面试季丰图科技—顺丰旗下专注GIS领域

WHITer内推——每天9点发布武汉优质互联网企业最新岗位内推机会。内推微信号:whxiaowai 内推邮箱:770554595qq.com01 Java高级开发工程师 12-25K点击查看职位详情 申请内推02高级python开发工程师 12-25K点击查看职位详情 申请内推03 物联网数据运营分析…

腾讯发布95页重磅报告:全面预测中国互联网未来5年趋势

腾讯科技企鹅智酷联合63位互联网行业领袖与专家发布了《企鹅智酷中国科技&互联网创新趋势白皮书(2017)》,预测了未来5年的中国互联网发展趋势。此次公开发布的版本共95页PPT,其中“移动直播产业”、“媒体与内容创业”、“互联…

.NET 6 平台系列1 .NET Framework发展历程

自1995年互联网战略日以来最雄心勃勃的事业 —— 微软.NET战略, 2000年6月30日。微软公司于2002年2月13日正式推出第一代.NET平台 .NET Framewrok 1.0。借助于自家强大易用的 Windows 系统,.NET Framework1.0 主要提供了面向 Windows 桌面(Windows Form&…

3 src 获取_CVE-2019-15846:Exim远程获取root权限漏洞分析

报告编号:B6-2019-103101报告来源:360-CERT报告作者:360-CERT更新日期:2019-10-310x00 漏洞背景2019年9月6日18:00,exim发布exim-4.92.2版本修复了CVE-2019-15846,攻击者可以利用此漏洞远程获取…

jwt与token+redis,哪种方案更好用?

问:jwt与tokenredis,哪种方案更好用?其实JWT就是Json Web Token,就是Token的典型方式。题主的JWT和TokenRedis的区别,其实都是Token,只是JWT的可靠性保障是来源于加密算法(对称加密和非对称两种)&#xff0…

想不到吧?数学还有如此妙用!

随着科技的快速发展,人工智能的重要性日渐显现。对于大多数新手来说,弄清楚入门人工智能需要哪些数学基础、需要熟悉什么框架等,都至关重要。机器学习是一个异常丰富的研究领域,有大量未解决的问题:公正、可解释性、易…

ASP.NET Core 开源项目 nopCommerce,一款沉淀13年的电商开源佳作!

技术在不断更新迭代,.NET 6 的正式版也即将正式发布,在.NET Core 开源项目方面,CMS的代表作是SiteServer,商城的开源系统有没有什么代表作?肯定是有的,强烈推荐这套开源免费的商城系统:nopComme…

Base PyQt4, Simple Web APP Framwork

长时间以来,一直针对Linux 服务器开发后台程序,每天面对的是黑框框,输出只有日志文件。偶尔需要模拟客户端测试,要么是写几行php代码,在浏览器上点一点,要么是写个小Python脚本在shell中执行一下。写了一些…

机器学习核心算法之——贝叶斯方法

1.贝叶斯公式贝叶斯公式已经成为机器学习的核心算法之一,诸如拼写检查、语言翻译、海难搜救、生物医药、疾病诊断、邮件过滤、文本分类、侦破案件、工业生产等诸多方面都有很广泛的应用,它也是很多机器学习算法的基础。在这里,有必要了解一下…

B 站面试官:“啥是重定向?”

三分钟,带你学习和实践域名重定向大家好,我是鱼皮,今天分享 重定向 小知识,以及我在腾讯云云开发中实现域名重定向的实践。孽起之前,我开发了一个编程导航网站,将网站放到了腾讯云云开发上,用云…

比起掉头发,我更怕掉队

程序员是最需要持续学习的职业可能在大家眼中,程序员是一群木讷、思维方式单一的物种,但其实,他们才是思维活跃,时刻保持学习力,不甘落后的一群人。计算机行业每天都会有新的东西出现,程序员们需要关注最新…

刷新mac地址命令_配置好Cisco交换机需要熟悉IOS命令及相关的知识

一、几种配置命令模式switch> 这种提示符表示是在用户命令模式,只能使用一些查看命令。switch# 这种提示符表示是在特权命令模式。switch(config)# 这种提示符表示是全局配置模式switch(config-if)# 端口配置命令模式二、检查、查看命令这些命令是查看当前配置…

WPF 使用FontAwesome字体图标

要搞点小软件,又不想使用图标和图标类库,突然想起FontAwesome,试了一下,还挺方便的,先弄了几个最常用的图标试一下,弄了几个按钮的样式,看一下效果:看一下fontAwesome使用方法:首先从…

从Google Maglev说起,如何造一个牛逼的负载均衡?

Maglev是谷歌为自己的数据中心研发的解决方案,并于2008开始用于生产环境。在第十三届网络系统设计与实现USENIX研讨会(NSDI ‘16)上, 来自谷歌、加州大学洛杉矶分校、SpaceX公司的工程师们分享了这一商用服务器负载均衡器Maglev的…

怎么打包图片_超简单的免费批量图片压缩技巧,只需3步

我们在上传图片的时候,经常会遇到一个问题,那就是图片文件太大,无法上传。那这个时候我们该怎么办呢?我们一般都会想到把图片进行压缩之后,重新上传。那么我们要怎么压缩图片呢?如果图片数量很多&#xff0…

Calendar类

接触java不久,感觉java真的挺好玩的。 Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法…