目的

在项目中,if else语句如果用得很多,特别是嵌套,代码不美观,阅读性不好。所以的话,用其他的方式简化替换if...else...就很有必要。

简化的作用就是赠人玫瑰,手留余香。对自己对项目对别人都是好事。

if else语句是啥?好比下图。

如何简化

一、 借助短路运算符 && ||

这两个是啥?就是大学时代学习数电的与或。短路逻辑就是说是否执行第二个语句(操作数)取决与第一个操作数的结果。

我们可以用 && 来决定是否执行一段代码或者 || 设置默认值。

// && || 经典模式
if (foo) bar(); ==> foo&&bar();
if (!foo) bar(); ==> foo||bar();
//&& 别人博客例子
function getInfoFromStorageBydid(key, did, success, error) {
wx.getStorage({
key: key,
success: function (res) {
var data = res.data[did];
if (data) {
typeof success === 'function' && success(data);
wx.hideToast();
} else {
typeof error === 'function' && error();
}
},
fail: function () {
typeof error === 'function' && error();
}
});
} //||
if(a){a = a} else {a = b} ==> a = a || b;

二、使用三元表达式

平时开发中使用率很高,特别是在页面数组渲染是根据一个字段的值来判断给哪个单位,或者中文描述等等。只要是2选一的,就无脑用呗。

if (foo) bar(); else baz(); ==> foo?bar():baz();
if (!foo) bar(); else baz(); ==> foo?baz():bar();
if(a == b ){ a = c }else { a = d } ==> a = (a==b)?c:d;

注意,三元表达式(操作符)不能使用return语句。

三、switch/case

如果if else的数量很大,分支很多,而且不仅仅是需要返回字段,需要干点什么。就用switch case吧。

例如

xxx.done(function(data){
switch(data.status){
case 'success':
//TODO
break;
case 'fail':
//TODO
break;
default:
//TODO
}
});

四、hase表(推荐)

hash表是什么?键值对的集合。对象就是hash

这个东西就类似映射那样。如果if else的数量很大,分支很多,而且就是让你返回一个字段。

就是上个月啊,和一个后台搞图片的功能。图片的待上传列表是那后台返回来的数组。写的时候,需要搞隐射,发现不好搞:一个页面,拿到SPECIAL_FATE_STORE_HEADER字段给后台specialFateStoreHeaderId字段;另外一个地方同理:specialFateStoreHeaderId->STORE_HEADER。为什么这么麻烦?后台小子逻辑差,经验不足,没处理好。一开始我使用switch case。搞了不少行代码,维护性也不好,因为有两套,改其中一个,另外一个也得跟着改。这时候,上面的那些数组遍历和对象遍历的内容就可以用进来了。再一次证明会js真的可以为所欲为,呵呵。代码如下。

let valueMap = {
SPECIAL_FATE_STORE_HEADER: 'specialFateStoreHeaderId'//值1:值2
//...这里省略了15行
}
//获取值的值
function getValueName(type) {
return valueMap[type] ? valueMap[type] : valueMap['SPECIAL_FATE_STORE_HEADER'];
}
//获取键的值
function getKeyName(targetValue){
let targetArr = Object.keys(valueMap).filter((key) => { return valueMap[key] == targetValue });
return targetArr.length === 0 ? 'STORE_HEADER' : targetArr[0].split('FATE_')[1]
}
console.log(getValueName('SPECIAL_FATE_STORE_HEADER'),'valueMap')
console.log(getKeyName('specialFateStoreHeaderId'),'valueMap')

以后再次来需求,我就在valueMap对象里面加。万一再来需求,后台小子还要值3,值4怎么办?难不到我。我修改valueMap的结构。再改下逻辑就行。

let valueMap = {
SPECIAL_FATE_STORE_HEADER: 'specialFateStoreHeaderId&&值3&&值4'//值1:值2 && 值3 && 值4
//...这里省略了15行
}

就拿我在项目中的遇到的一个问题吧,有个搜索框,是很多页面共用的,可以查询客户经理,银行,分行等等。不同接口的方法类型和需要的数值不一样,情况就7到8种。我那个同事啊,写了很多if-else。看起来很麻烦,瞬间就不想再看。其实这时候可以使用hash来,结合反引号可以动态引入变量值。代码如下,注意啊,每个键值对都要加双引号(除非是数字),不能是单引号,否则JSON.parse会出现报错。

let mapObj = {
1:`{
"data": {"name": "${value}","branchId": ${this.id}},
"type": "get"
}`,
2:`{
"data": {"name": "${value}"},
"type": "post"
}`
}
data = JSON.parse(mapObj[this.type]).data

五、省略括号

如果能省略括号就直接省略括号吧,阅读起来特别直观。

//省略前
if(a > b){
console.log('a大');
}else{
console.log('b大');
}; //省略后
if(a > b) console.log('a大');
else console.log('b大');

最后,欢迎关注我的公众号。

js使用经验--if...else简化的更多相关文章

  1. node.js使用经验记录

    MongoDB使用经验: 有时不知道MongoDB的错误码代表什么,那有这个链接: https://github.com/mongodb/mongo/blob/master/src/mongo/bas ...

  2. HTML5 Canvas JavaScript库 Fabric.js 使用经验

    首先,表明我的态度:采用 Flash 才是最优方案,不建议使用 HTML 5 的 Canvas 做一些生产/工业级的网页应用. Flash的优势一是浏览器支持好,二是代码成熟稳定.而HTML5 的 C ...

  3. js使用经验--遍历

    目的 在平常的前端开发中,一般需要处理数据(数组和对象居多),特别是复杂功能的页面,通常是一到两个对象数组(有时数组里面还有数组).大多数前端开发的难点就是这里,耗时大.以前我在工作中,遇到的支付方式 ...

  4. JS当中利用&&和||简化代码

    ; ){ add_level = ; } ){ add_level = ; } ){ add_level = ; } ){ add_level = ; } else { add_level = ; } ...

  5. 【原】js 签到用日历

    最近做的一个项目中,需要用到一个日历来记录你的签到,网上找了一些,感觉挺庞大的,所以就自己写了一个,记录一下自己写这个日历的经过 html代码: <table cellspacing=" ...

  6. js 介绍

    createjs 工作内容:html5游戏开发岗位要求:1. 熟悉HTML5特性, 掌握canvas开发技能;2.能独立的搭建出易扩展,高效,强壮,通用的前端底层框架;3.熟悉常用的JS开发框架或工具 ...

  7. JQuery的$和其它JS发生冲突的快速解决方法

    众所周知,jQuery是目前最流行的JS封装包,简化了很多复杂的JS程序,JQuery讲浏览器DOM树定义为$,通过$来获取各个子节点. 然后,JS插件并非只有JQuery,还有prototype.j ...

  8. 前端JS插件整理

    1.JQuery.js JavaScript 库,简化JS. 官网地址:https://jquery.com/ 菜鸟教程:http://www.runoob.com/jquery/jquery-tut ...

  9. Angular、React.js 和Node.js到底选谁?

    为了工作,程序员选择正确的框架和库来构建应用程序是至关重要的,这也就是为什么Angular和React之间有着太多的争议.Node.js的出现,让这场战争变得更加复杂,虽然有选择权通常是一件很棒的事情 ...

随机推荐

  1. DataTable运用

    DataTable dataDis.AsEnumerable().Sum(bu => bu["QtyPlan"].ConvertInt32()); ndata.TDefSty ...

  2. Java 动态编译--DynamicCompiler

    java 动态编译自己写过程的机会比较少,记录一下: package com.xzlf.dynamicCompile; import java.io.IOException; import java. ...

  3. JasperReports入门教程(二):中文打印

    JasperReports入门教程(二):中文打印 背景 在上一篇中我们介绍了JasperReport的基本入门,也展示了一个报表.但是我们的示例都是使用的英文,如果我们把需要打印的数据改为中文会怎么 ...

  4. 用scrapy实现模拟登陆

    class Test1sSpider(scrapy.Spider): name = 'test1s' allowed_domains = ['yaozh.com'] start_urls = ['ht ...

  5. StringRedisTemplate的常用操作

    stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);//向r ...

  6. Zabbix CPU utilization监控参数

    工作中查看Zabbix linux 监控项的时候对linux 监控的cpu使用的各个参数没怎么明白,特意查看了下资料 Zabbix linux模板下的CPU utilization是自带的监控Linu ...

  7. apollo 项目配置中心开源框架部署

    apollo 于我带来的好处 1. 项目之前的配置信息全部都在 resources 目录下,当然这里我使用的是 Spring Boot 搭建的项目.使用 apollo 后,配置信息全部转移到 apol ...

  8. POJ1077 八数码问题

    题目:八数码 网址:http://poj.org/problem?id=1077 在一个3×3的网格中,1~8这8个数字和一个"X"恰好不重不漏地分布在这3×3的网格中. 例如: ...

  9. 【DNS域名解析命令】host

    host - DNS lookup utility host命令是常用的分析域名查询工具,可以用来测试域名系统工作是否正常. 语法: host [-aCdlnrsTwv] [-c class] [-N ...

  10. Clustered和Nonclustered Indexes 各自得特点和区别及长短处

    1 簇索引 簇索引对表的物理数据页中的数据按列进行排序然后再重新存储到磁盘上即簇索 引与数据是混为一体的它的叶节点中存储的是实际的数据由于簇索引对表中的数据一 一进行了排序因此用簇索引查找数据很快但由 ...