js使用经验--if...else简化
目的
在项目中,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简化的更多相关文章
- node.js使用经验记录
MongoDB使用经验: 有时不知道MongoDB的错误码代表什么,那有这个链接: https://github.com/mongodb/mongo/blob/master/src/mongo/bas ...
- HTML5 Canvas JavaScript库 Fabric.js 使用经验
首先,表明我的态度:采用 Flash 才是最优方案,不建议使用 HTML 5 的 Canvas 做一些生产/工业级的网页应用. Flash的优势一是浏览器支持好,二是代码成熟稳定.而HTML5 的 C ...
- js使用经验--遍历
目的 在平常的前端开发中,一般需要处理数据(数组和对象居多),特别是复杂功能的页面,通常是一到两个对象数组(有时数组里面还有数组).大多数前端开发的难点就是这里,耗时大.以前我在工作中,遇到的支付方式 ...
- JS当中利用&&和||简化代码
; ){ add_level = ; } ){ add_level = ; } ){ add_level = ; } ){ add_level = ; } else { add_level = ; } ...
- 【原】js 签到用日历
最近做的一个项目中,需要用到一个日历来记录你的签到,网上找了一些,感觉挺庞大的,所以就自己写了一个,记录一下自己写这个日历的经过 html代码: <table cellspacing=" ...
- js 介绍
createjs 工作内容:html5游戏开发岗位要求:1. 熟悉HTML5特性, 掌握canvas开发技能;2.能独立的搭建出易扩展,高效,强壮,通用的前端底层框架;3.熟悉常用的JS开发框架或工具 ...
- JQuery的$和其它JS发生冲突的快速解决方法
众所周知,jQuery是目前最流行的JS封装包,简化了很多复杂的JS程序,JQuery讲浏览器DOM树定义为$,通过$来获取各个子节点. 然后,JS插件并非只有JQuery,还有prototype.j ...
- 前端JS插件整理
1.JQuery.js JavaScript 库,简化JS. 官网地址:https://jquery.com/ 菜鸟教程:http://www.runoob.com/jquery/jquery-tut ...
- Angular、React.js 和Node.js到底选谁?
为了工作,程序员选择正确的框架和库来构建应用程序是至关重要的,这也就是为什么Angular和React之间有着太多的争议.Node.js的出现,让这场战争变得更加复杂,虽然有选择权通常是一件很棒的事情 ...
随机推荐
- vue+element-ui中引入阿里播放器
1.在public文件下的index.html文件中插入以下代码: <link rel="stylesheet" href="https://g.alicdn.co ...
- python 给字典按值排序,同样适合于其他
sorted_items = sorted(dico.items(),key=lambda x:(-x[1],x[0]))
- python安装pil库,操作流程以及安装中出现的问题。
0.用管理员方式打开cmd窗口. 1.跳转到python对应目录 比我: ***或者直接在该路径下输入cmd直接跳转.**** 例如: 直接回车搞定!! 2.输入 pip install pillow ...
- udp包最大数据长度是多少
因为udp包头有2个byte用于记录包体长度. 2个byte可表示最大值为: 2^16-1=64K-1=65535 udp包头占8字节, ip包头占20字节, 65535-28 = 65507 ...
- Qt 与 .Net 为何不兼容
哪怕是非Qt的静态库里用了 .Net 也不行.
- Zabbix3.0安装部署最佳实践
Zabbix介绍 1.1zabbix 简介 Zabbix 是一个高度集成的网络监控解决方案,可以提供企业级的开源分布式监控解决方案,由一个国外的团队持续维护更新,软件可以自由下载使用,运作团队靠提供收 ...
- 讲讲python中函数的参数
python中函数的参数 形参:定义函数时代表函数的形式参数 实参:调用函数时传入的实际参数 列如: def f(x,y): # x,y形参 print(x, y) f(1, 2) # 1, 2 实参 ...
- CodeForces - 1102A(思维题)
https://vjudge.net/problem/2135388/origin Describe You are given an integer sequence 1,2,-,n. You ha ...
- CodeForces - 1058A. In Search of an Easy Problem
这题,全零是esay有1是hard,真难呀. #include<bits/stdc++.h> using namespace std; int main(){ int n,i,x,flag ...
- badboy 录制脚本
第一步:介绍badboy工具 1.1: 页面功能分析: 1. 界面视图,模拟浏览器,能够进行操作 2. 需要录制脚本的URL 3. 点击运行URL 4. Summary:运行的各指标,响应时间,成功事 ...