运算符的代码优化,可以精简代码,提高代码可读性

下面主要讨论下逻辑运算符与 &&, 或||。

示例:

假设对成长速度显示规定如下:

  1. 成长速度为5显示1个箭头;
  2. 成长速度为10显示2个箭头;
  3. 成长速度为12显示3个箭头;
  4. 成长速度为15显示4个箭头;
  5. 其他都显示都显示0个箭头。

用代码怎么实现?

 1 //if else 实现
2 var add_level = 0;
3 if(add_step == 5){
4 add_level = 1;
5 } else if (add_step == 10){
6 add_level = 2;
7 } else if (add_step == 12){
8 add_level = 3;
9 } else if (add_step == 15){
10 add_level = 4;
11 } else {
12 add_level = 0;
13 }

也可以用switch实现

 1 //用switch实现
2 var add_level = 0;
3 switch(add_step){
4 case 5 :
5 add_level = 1;
6 break;
7 case 10 :
8 add_level = 2;
9 break;
10 case 12 :
11 add_level = 3;
12 break;
13 case 15 :
14 add_level = 4;
15 break;
16 default :
17 add_level = 0;
18 break;
19 }

如果需求改成:

  1. 成长速度为>12显示4个箭头;
  2. 成长速度为>10显示3个箭头;
  3. 成长速度为>5显示2个箭头;
  4. 成长速度为>0显示1个箭头;
  5. 成长速度为<=0显示0个箭头。

你有没有想过用一行就代码实现呢?

 1 //&& ||实现 2 var add_level = (add_step==5 && 1) || (add_step==10 && 2) || (add_step==12 && 3) || (add_step==15 && 4) || 0;  

更优雅的方式

 1 //更优雅的方式 2 var add_level={'5':1,'10':2,'12':3,'15':4}[add_step] || 0;  

第二个需求:

 1 var add_level = (add_step>12 && 4) || (add_step>10 && 3) || (add_step>5 && 2) || (add_step>0 && 1) || 0;  

讨论区:

几乎所有语言中||和&&都遵循“短路”原理,如&&中第一个表达式为假就不会去处理第二个表达式,而||正好相反。 js也遵循上述原则。但是比较有意思的是它们返回的值。

1 var attr = true && 4 && “aaa”;

那么运行的结果attr就不是简单的true或这false,而是”aaa”

再来看看||:

1 var attr = attr || “”;

这个运算经常用来判断一个变量是否已定义,如果没有定义就给他一个初始值,这在给函数的参数定义一个默认值的时候比较有用。

首先我们来梳理一下一个概念,请你一定要记住:在js逻辑运算中,0、""、null、false、undefined、NaN都会判为false,其他都为true(好像没有遗漏了吧,请各位确认下)。这个一定要记住,不然应用||和&&就会出现问题。 这里顺便提下:经常有人问我,看到很多代码if(!!attr),为什么不直接写if(attr); 其实这是一种更严谨的写法: 请测试 typeof 5和typeof !!5的区别。!!的作用是把一个其他类型的变量转成的bool类型。

再次提醒你记住上面的原则:如果实参需要是0、""、null、false、undefined、NaN的时候也会当false来处理。

1 if(a >=5){
2 alert("你好");
3 }
4 //可以改写成
5 a >= 5 && alert("你好");

这样只需一行代码就搞定。但是需要注意的一点:js中||和&&的特性帮我们精简了代码的同时,也带来了代码可读性的降低。这就需要我们自己来权衡了。

扩展

一方面精简js代码,能实质性的减少网络流量,尤其是大量应用的js公用库。个人比较推荐的做法是:如果是相对复杂的应用,请适当地写一些注释。这个和正在表达式一样,能够精简代码,但是可读性会降低,对读代码的人要求会高些,最好的办法就是写注释。

我们可以不使用这些技巧,但是我们一定要能看懂,因为这些技巧已经广泛应用,尤其是像JQuery等js框里的代码,不理解这些你就很难看懂别人的代码。 像


 var Yahoo = Yahoo || {}; 

这种是非常广泛应用的。 ok,最后让我们来看一段jQuery中的代码吧:

 1 var wrap =
2 // option or optgroup
3 !tags.indexOf("<opt") &&
4 [ 1, "<select multiple='multiple'>", "</select>" ] ||
5
6 !tags.indexOf("<leg") &&
7 [ 1, "<fieldset>", "</fieldset>" ] ||
8
9 tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
10 [ 1, "<table>", "</table>" ] ||
11
12 !tags.indexOf("<tr") &&
13 [ 2, "<table><tbody>", "</tbody></table>" ] ||
14
15 // <thead> matched above
16 (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
17 [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
18
19 !tags.indexOf("<col") &&
20 [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
21
22 // IE can't serialize <link> and <script> tags normally
23 !jQuery.support.htmlSerialize &&
24 [ 1, "div<div>", "</div>" ] ||
25
26 [ 0, "", "" ];
27
28 // Go to html and back, then peel off extra wrappers
29 div.innerHTML = wrap[1] + elem + wrap[2];
30
31 // Move to the right depth
32 while ( wrap[0]-- )
33 div = div.lastChild;

这段代码是用来处理 $(html) 时,有些标签必须要约束的,如<option>必须在<select></select>之内的。 可能你也发现了还有一个很巧的地方就是 !tags.indexOf("<opt"),很巧妙的就实现了startWith的功能了,没有一点多余的代码。

扩展总结

例1:用于赋值

&&:从左往右依次判断,当当前值为true则继续,为false则返回此值(是返回未转换为布尔值时的原值哦)

|| : 从左往右依次判断,当当前值为false则继续,为true则返回此值(是返回未转换为布尔值时的原值哦)

 1 // => aaa
2 var attr = true && 4 && "aaa";
3
4 // => 0
5 var attr = true && 0 && "aaa";
6
7 // => 100
8 var attr = 100 || 12;
9
10 // => e
11 var attr = "e" || "hahaha"
12
13 // => hahaha
14 var attr = "" || "hahaha"
例2 经过多次判断的赋值
1 /*
2 x>=15时 => 4
3 x>=12时 => 3
4 x>=10时 => 2
5 x>=5时 => 1
6 x<5时 => 0
7 */
8 console.log((x>=15 && 4) || (x>=12 && 3) || (x>=10 && 2) || (x>=5 && 1) || 0);
例3 与对象形式的变量合体
1 /*
2 x=15 时 => 4
3 x=12 时 => 3
4 x=10 时 => 2
5 x=5 时 => 1
6 其它 => 0
7 */
8 console.log( {'5':1,'10':2,'12':3,'15':4}[x] || 0 );
例4 用于执行语句
 1 if(a >=5){alert("你好");} 2 //可以写成:  3 a >= 5 && alert("你好"); 

  • 给向往远方的你: 没有比脚更长的路,没有比人更高的山。 --汪国真《山高路远》

优化:js 逻辑运算符优化的更多相关文章

  1. js 逻辑运算符优化

    运算符的代码优化,可以精简代码,提高代码可读性 下面主要讨论下逻辑运算符与 &&, 或||. 示例: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头: 成长速度为10显示2个箭 ...

  2. 应用r.js来优化你的前端

    r.js是requireJS的优化(Optimizer)工具,可以实现前端文件的压缩与合并,在requireJS异步按需加载的基础上进一步提供前端优化,减小前端文件大小.减少对服务器的文件请求.要使用 ...

  3. 优化JS加载时间过长的一种思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 去年公司在漳州的一个项目中,现场工程人员反映地图部分出图有点 ...

  4. js性能优化-事件委托

    js性能优化-事件委托 考虑一个列表,在li的数量非常少的时候,为每一个li添加事件侦听当然不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(当然只是一个解释,实际工作中很少 ...

  5. 我所经历的JS性能优化

    转自http://www.cnblogs.com/koking/archive/2011/10/17/2215665.html 折腾了好几天,纠结了好几天,郁闷了好几天,终于在今天可以释怀了,留下其中 ...

  6. js Memoization 优化运行速度

    项目中需要用到 大计算量 耗时的js运算. Memoize 是一个优化方法 ,对耗时的递归运算,漫长的查找运算的结果进行缓存,使运行时间最小化 原理是缓存先前的结果计算值从而可以避免需要重新计算   ...

  7. js 性能优化利器:prepack

    1. js 性能优化 js 本身是没有像 python 一样的预编译功能,更没有像 java 一样的编译功能,所以,这里所说的 js 代码预编译 只是通过工具实现的类似功能而已. 这就要提到 prep ...

  8. 优化 JS 条件语句的 5 个技巧

    优化 JS 条件语句的 5 个技巧 原创: 前端大全 前端大全 昨天 (给前端大全加星标,提升前端技能) 编译:伯乐在线/Mr.Dcheng http://blog.jobbole.com/11467 ...

  9. js 性能优化 篇一

    JS性能优化 摘自:http://www.china125.com/design/js/3631.htm  首先,由于JS是一种解释型语言,执行速度要比编译型语言慢得多.(注:,Chrome是第一款内 ...

随机推荐

  1. 尚硅谷【SpringBoot】web(源码讲解太多不建议阅读)

    四.Web开发 1.简介 使用SpringBoot: 1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可 ...

  2. linux运维注意事项

    防火墙和selinux一定要注意 服务器或应用出现错误是一定要查看服务器运行状态是否正确,及其相关运行日志 不管什么时候,能不要特殊字符就不要用特殊字符,避免不必要的错误 在看部署文档的时候一定要认真 ...

  3. Centos7快速安装haproxy

    HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要 ...

  4. sofa graphql 2 rest api框架

    sofa 是一个出发点不一样的工具,提供了从graphql 2 rest 的处理,一般现有的框架都在 关注的是rest 2 graphql (大部分还是基于swagger.open api 标准进行设 ...

  5. 普林斯顿数学指南(第一卷) (Timothy Gowers 著)

    第I部分 引论 I.1 数学是做什么的 I.2 数学的语言和语法 I.3 一些基本的数学定义 I.4 数学研究的一般目的 第II部分 现代数学的起源 II.1 从数到数系 II.2 几何学 II.3 ...

  6. 996.icu 事件后

    996.icu 事件后 雇主 更加关注效率 减少成本 分工再细化 精简人员 雇员 法律意识加强 个人权利争取 效率低者下岗 技能提高 效率提高 影响 商业社会更有效率 人力市场竞争更加激烈 国内竞争力 ...

  7. pyspark数据准备

    鸢尾花数据集 5.1,3.5,1.4,0.2,Iris-setosa 4.9,3.0,1.4,0.2,Iris-setosa 4.7,3.2,1.3,0.2,Iris-setosa 4.6,3.1,1 ...

  8. jsp配置文件数据信息读取

    一.jsp从配置文件*.properties读取信息 <%@ page language="java" import="java.util.*" cont ...

  9. Jmeter关于断言

    本文摘自:一颗糖果   https://www.cnblogs.com/linglingyuese/p/linglingyuese-five.html 1.断言持续时间(Duration to Ass ...

  10. 调试PHP错误

    error_reporting(E_ALL & ~E_NOTICE); ini_set('display_errors', "On");