如题:

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

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

用代码怎么实现?

差一点的用if else:

var add_level = 0;
if(add_step == 5){ add_level = 1;
}
else if(add_step == 10){ add_level = 2;
}
else if(add_step == 12){ add_level = 3;
}
else if(add_step == 15){ add_level = 4;
}
else { add_level = 0;
} 

稍好些的switch:

var add_level = 0;
switch(add_step){ case 5 : add_level = 1; break;
case 10 : add_level = 2; break;
case 12 : add_level = 3; break; case 15 : add_level = 4; break;
default : add_level = 0; break; }

如果需求改成:

成长速度为>12显示4个箭头; 
成长速度为>10显示3个箭头;

那么用switch也很麻烦。

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

然我们来看看JS强大的表现力吧:

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

更强大的,也更优秀:

var add_level = {'5':1,'10':2,'12':3,'15':4}[add_step] || 0;

几乎所有语言中||和&&都遵循“短路”原理,如&&中第一个表达式为假就不会去处理第二个表达式,而||正好相反。

js也遵循上述原则。但是比较有意思的是它们返回的值:

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

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

再来看看||:

var attr = attr || “”;

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

if(a >=5){ alert("你好");
}
//可以写成:
a >= 5 && alert("你好"); 

这样只需一行代码就搞定。但是需要注意的一点就是:js中||和&&的特性帮我们精简了代码的同时,也带来了代码可读性的降低。这就需要我们自己来权衡了。 
一方面精简js代码,能实质性的减少网络流量,尤其是大量应用的js公用库。个人比较推荐的做法是:如果是相对复杂的应用,请适当地写一些注释。这个和正在表达式一样,能够精简代码,但是可读性会降低,对读代码的人要求会高些,最好的办法就是写注释。

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

var Yahoo = Yahoo || {};

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

var wrap = // option or optgroup !tags.indexOf("<opt") && [ 1, "<select multiple='multiple'>", "</select>" ] || !tags.indexOf("<leg") && [ 1, "<fieldset>", "</fieldset>" ] || tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && [ 1, "<table>", "</table>" ] || !tags.indexOf("<tr") && [ 2, "<table><tbody>", "</tbody></table>" ] || // <thead> matched above (!tags.indexOf("<td") || !tags.indexOf("<th")) && [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] || !tags.indexOf("<col") && [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] || // IE can't serialize <link> and <script> tags normally !jQuery.support.htmlSerialize && [ 1, "div<div>", "</div>" ] || [ 0, "", "" ]; // Go to html and back, then peel off extra wrappers div.innerHTML = wrap[1] + elem + wrap[2]; // Move to the right depth while ( wrap[0]-- ) div = div.lastChild; 

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

转载于:https://www.cnblogs.com/tracyzeng/p/5772790.html

js技巧之与或运算符 || 妙用相关推荐

  1. js 与或运算符 || 妙用

    js 与或运算符 || && 妙用,可用于精简代码,降低程序的可读性. 首先出个题: 如图:  假设对成长速度显示规定如下:  成长速度为5显示1个箭头:  成长速度为10显示2个箭头 ...

  2. js技巧--转义符\的妙用

    js技巧--转义符"\"的妙用 // blueDestiny, never-online // blueDestiny [at] 126.com 通常,我们在动态给定一个conta ...

  3. 常用网页使用js技巧收集(200多个)经典

    常用网页使用js技巧收集(200多个)经典 1.文本框焦点问题 onBlur:当失去输入焦点后产生该事件 onFocus:当输入获得焦点后,产生该文件 Onchange:当文字值改变时,产生该事件 O ...

  4. js 技巧杂引(转)

    js 技巧杂引(转) posted on 2005年9月28日 1:12 由 Snow 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释 ...

  5. 一些冷门的JS技巧 顶

    一些冷门的JS技巧    顶!!! 前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quo ...

  6. 火狐浏览器调试js技巧_充分利用Firefox的最佳技巧和调整

    火狐浏览器调试js技巧 Firefox is one of the more popular web browsers that runs on Windows, Linux, and Mac OS ...

  7. js 运算符 || 妙用

    首先出个题: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头: 成长速度为10显示2个箭头: 成长速度为12显示3个箭头: 成长速度为15显示4个箭头: 其他都显示都显示0各箭头. 用代码怎么 ...

  8. js中“||”和“”的高级用法 js,与或运算符 || 妙用

    网络上找到的一篇关于逻辑与和逻辑或的文章,详细记录一下. http://www.jb51.net/article/21339.htm 例1:用于赋值 &&:从左往右依次判断,当当前值为 ...

  9. Javascript开发技巧(JS中的变量、运算符、分支结构、循环结构)

    一.Js简介和入门 继续跟进JS开发的相关教程. <!-- [使用JS的三种方式] 1.HTML标签中内嵌JS(不提倡使用): 示例:<button οnclick="javas ...

最新文章

  1. HTML 表单(form) 使用详解
  2. JS的深拷贝和浅拷贝
  3. 计算机的桌面图标都没有了怎么办,电脑桌面图标都没了怎么办 怎么恢复
  4. qt 实现的电视遥控系统,如何让qt响应来自遥控器的按键信息?
  5. JAVA基础5——与String相关的系列(1)
  6. shell 目录下文件名放入循环_批量删除同一目录下的文件名前缀
  7. oracle错误号大全(查询ora错误号以及解决方法技巧)
  8. 江苏计算机一级怎么自学,江苏计算机一级自学教程推荐:计算机基础及MS Office应用上机指导(2018年版)...
  9. 如何实现A星寻路算法 Cocos2d-x 3 0 beta2
  10. python提取tuple列表中的特定位置的值
  11. python切换虚拟环境和全局_为什么python虚拟环境启动后依然使用全局的python和pip...
  12. 修改完out不更新_CyclicBarrier 不就是比 CountDownLatch 多了个回环么?
  13. 【手写】数据库关系代数练习题
  14. IP数据包格式、ICMP、ARP
  15. 视频监控 ezuikit.js
  16. c++一本通在线测评网站 1161:转进制
  17. 烽火超微信息科技 服务器,智算升级 烽火超微发布新一代V6服务器
  18. 一些PDG格式的Linux书籍(转)
  19. 优秀的管理者如何带好团队(这几个技巧你是否学会)
  20. Jetson TX2之ALSA学习

热门文章

  1. git:如何让不同开发者提交在同一条直线上
  2. (3) ebj学习:有状态bean和无状态bean区别
  3. C#工厂方法模式 -抽象工厂模式
  4. 如何缩短visual studio行号的距离
  5. Java 冒泡排序实现及口诀
  6. 宏基aspire拆机触摸_如何拆解宏基Acer Aspire 4530
  7. linux安装xgboost快速高效方法
  8. LINUX ltrace命令-用来跟踪进程调用库函数的情况学习
  9. JDBC之二:DAO模式
  10. 完美图解教程 Linux环境VNC服务安装、配置与使用