目的

在项目中,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. 数值计算方法实验之newton多项式插值 (Python 代码)

    一.实验目的 在己知f(x),x∈[a,b]的表达式,但函数值不便计算或不知f(x),x∈[a,b]而又需要给出其在[a,b]上的值时,按插值原则f(xi)=yi (i=0,1,……, n)求出简单函 ...

  2. Java IO 流 -- 数据流和对象流 DataOutputStream ObjectOutputStream

    DataOutputStream 和 ObjectOutputStream的共同点是: 1.写出后读取 2.读取顺序和写出一致 数据流操作: // 写入 ByteArrayOutputStream b ...

  3. Python操作MySQL之查看、增删改、自增ID

    在python中用pymysql模块来对mysql进行操作,该模块本质就是一个套接字客户端软件,使用前需要事先安装,在cmd中输入: pip3 install pymysql 1.查看 import ...

  4. IIS WebDAV安全配置

    本文为转载,原文地址:http://www.2cto.com/article/201307/228165.html IIS WebDAV安全配置 2013-07-16 12:13:00 作者:瞌睡龙收 ...

  5. JavaScript面向对象的作用域链(转载)

    JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.“JavaScript中无块级作用域” 在Java或C# ...

  6. bootstrap-导航(垂直分组)

    1.运行效果如图所示 2.实现代码如下 <!DOCTYPE html> <html> <head>     <meta charset="utf-8 ...

  7. NodeJs mysql 开启事务

    如题:node后台使用mysql数据库,并使用事务来管理数据库操作. 这里主要讲一个事务的封装并写了一个INSERT 插入操作. code: 基础code: db.config.js const my ...

  8. [USACO1.3]虫洞wormhole

    题目描述 农夫约翰爱好在周末进行高能物理实验的结果却适得其反,导致N个虫洞在农场上(2<=N<=12,n是偶数),每个在农场二维地图的一个不同点. 根据他的计算,约翰知道他的虫洞将形成 N ...

  9. U盘安装Proxmox VE(一)

    转自我的个人博客:U盘安装Proxmox VE(一) 年前搞了个星际蜗牛B款机箱,利用手头之前海淘dq77kb组装了个四盘位的Server. 组装完毕后,直接在实体机安装了centos 7.使用这几个 ...

  10. awk调用外部程序

    程序的功能很简单: 调用外部解密程序decoder,将文件第二列字段解密,然后写入新文件中. BEGIN { OFS = "\t" } { outputFileName = &qu ...