js技巧之与或运算符 || 妙用
如题:
假设对成长速度显示规定如下:
成长速度为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技巧之与或运算符 || 妙用相关推荐
- js 与或运算符 || 妙用
js 与或运算符 || && 妙用,可用于精简代码,降低程序的可读性. 首先出个题: 如图: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头: 成长速度为10显示2个箭头 ...
- js技巧--转义符\的妙用
js技巧--转义符"\"的妙用 // blueDestiny, never-online // blueDestiny [at] 126.com 通常,我们在动态给定一个conta ...
- 常用网页使用js技巧收集(200多个)经典
常用网页使用js技巧收集(200多个)经典 1.文本框焦点问题 onBlur:当失去输入焦点后产生该事件 onFocus:当输入获得焦点后,产生该文件 Onchange:当文字值改变时,产生该事件 O ...
- js 技巧杂引(转)
js 技巧杂引(转) posted on 2005年9月28日 1:12 由 Snow 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释 ...
- 一些冷门的JS技巧 顶
一些冷门的JS技巧 顶!!! 前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quo ...
- 火狐浏览器调试js技巧_充分利用Firefox的最佳技巧和调整
火狐浏览器调试js技巧 Firefox is one of the more popular web browsers that runs on Windows, Linux, and Mac OS ...
- js 运算符 || 妙用
首先出个题: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头: 成长速度为10显示2个箭头: 成长速度为12显示3个箭头: 成长速度为15显示4个箭头: 其他都显示都显示0各箭头. 用代码怎么 ...
- js中“||”和“”的高级用法 js,与或运算符 || 妙用
网络上找到的一篇关于逻辑与和逻辑或的文章,详细记录一下. http://www.jb51.net/article/21339.htm 例1:用于赋值 &&:从左往右依次判断,当当前值为 ...
- Javascript开发技巧(JS中的变量、运算符、分支结构、循环结构)
一.Js简介和入门 继续跟进JS开发的相关教程. <!-- [使用JS的三种方式] 1.HTML标签中内嵌JS(不提倡使用): 示例:<button οnclick="javas ...
最新文章
- HTML 表单(form) 使用详解
- JS的深拷贝和浅拷贝
- 计算机的桌面图标都没有了怎么办,电脑桌面图标都没了怎么办 怎么恢复
- qt 实现的电视遥控系统,如何让qt响应来自遥控器的按键信息?
- JAVA基础5——与String相关的系列(1)
- shell 目录下文件名放入循环_批量删除同一目录下的文件名前缀
- oracle错误号大全(查询ora错误号以及解决方法技巧)
- 江苏计算机一级怎么自学,江苏计算机一级自学教程推荐:计算机基础及MS Office应用上机指导(2018年版)...
- 如何实现A星寻路算法 Cocos2d-x 3 0 beta2
- python提取tuple列表中的特定位置的值
- python切换虚拟环境和全局_为什么python虚拟环境启动后依然使用全局的python和pip...
- 修改完out不更新_CyclicBarrier 不就是比 CountDownLatch 多了个回环么?
- 【手写】数据库关系代数练习题
- IP数据包格式、ICMP、ARP
- 视频监控 ezuikit.js
- c++一本通在线测评网站 1161:转进制
- 烽火超微信息科技 服务器,智算升级 烽火超微发布新一代V6服务器
- 一些PDG格式的Linux书籍(转)
- 优秀的管理者如何带好团队(这几个技巧你是否学会)
- Jetson TX2之ALSA学习