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

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

示例:

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

  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. 有关vuex的问题

    在引入mapMutations时报错,解决方法: 1:npm install --save-dev babel-plugin-transform-object-rest-spread 2:在packa ...

  2. 使用skipper 扩展fabio 的路由&&http proxy 功能

    skipper 具有强大的http 路由功能,fabio 是一个方便的基于consul 的负载均衡软件, 我们可以方便的使用skipper 路由功能进行fabio的扩展,使用registrator 进 ...

  3. 01python简介

    目录 1.  Python起源 2.  解释器 3.  Python 的设计目标 4.  Python 的设计哲学 5.  为什么选择  Python ? 6.  Python 特点 7.  Pyth ...

  4. 初等数论及其应用 (第6版) (Kenneth H.Rosen 著)

    第1章 整数 1.1 数和序列 1.2 和与积 1.3 数学归纳法 1.4 斐波那契数 1.5 整除性 第2章 整数的表示法和运算 2.1 整数的表示法 2.2 整数的计算机运算 2.3 整数运算的复 ...

  5. 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新

    大家好,  我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain  用于 热更新 . 简单的说, 原理就是 类似 Asp.net 那样 让 当前 WebApp 运行在一个 A ...

  6. 手动制作openstack windows镜像

    https://docs.openstack.org/image-guide/windows-image.html 这里以 windows 2008为例: 准备工作: 1准备好windows 2008 ...

  7. spring-IOC容器(二)

    一.bean配置里面使用外部属性文件: <bean>中添加context Schema定义,Spring 提供了一个<property-placeholder>元素,可以在be ...

  8. Zookeeper 四字命令 Four Letter Words

    1.zk可以通过它自身提供的简写命令来服务器进行交互 需要使用到nc命令,安装yum install nc echo  [commond] | nc [ip] [port] 2.[stat]  查看z ...

  9. Hadoop的单机模式、伪分布式模式和完全分布式模式

    1.单机(非分布式)模式 这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统. 2.伪分布式运行模式 这种模式也是在一台单机上运行,但用不同的Java进程模仿分布式运行中 ...

  10. 读取配置文件的C语言接口实现

    在一些场合,需要对一些配置文件进行读取,去设置软件的参数,自己实现了一些接口函数,以供以后使用. ConfigFile.c #include <stdio.h> #include < ...