首先出个题:

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

成长速度为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个箭头;

成长速度为>5显示2个箭头;

成长速度为>0显示1个箭头;

成长速度为<=0显示0个箭头。

那么用switch实现起来也很麻烦了。

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

ok,让我们来看看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; 

第二个需求:

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

首先我们来梳理一下一个概念,请你一定要记住:在js逻辑运算中,0、""、null、false、undefined、NaN都会判为false,其他都为true(好像没有遗漏了吧,请各位确认下)。这个一定要记住,不然应用||和&&就会出现问题。

这里顺便提下:经常有人问我,看到很多代码if(!!attr),为什么不直接写if(attr);
其实这是一种更严谨的写法:
请测试 typeof 5和typeof !!5的区别。!!的作用是把一个其他类型的变量转成的bool类型。

下面主要讨论下逻辑运算符&&和||。

几乎所有语言中||和&&都遵循“短路”原理,如&&中第一个表达式为假就不会去处理第二个表达式,而||正好相反。
js也遵循上述原则。但是比较有意思的是它们返回的值。
代码:var attr = true && 4 && “aaa”;
那么运行的结果attr就不是简单的true或这false,而是”aaa”
再来看看||:
代码:var attr = attr || “”;这个运算经常用来判断一个变量是否已定义,如果没有定义就给他一个初始值,这在给函数的参数定义一个默认值的时候比较有用。因为js不像php可以直接在型参数上定义func($attr=5)。再次提醒你记住上面的原则:如果实参需要是0、""、null、false、undefined、NaN的时候也会当false来处理。

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源代码中还有很多如此精妙的代码,大家可以去学习学习。

代码

null==undefined : true  
null=="" : false  
null==0 : false  
0=="" : true  
false==0 : true  
false=="" : true  
true==0 : false  
true==1 : true  
true==-1 : false  
false==null : false  
'': undefined   
false==undefined : false  
-0===+0 : true  
-0==+0 : true  
-(-0)===0 : true  
false===(!true) : true  
typeof(null) : object   
typeof(false) : boolean  
typeof(undefined) : undefined   
typeof(1) : number   
typeof(+1.1) : number

给大家留下一个问题:3||6&&9的运算结果是什么? 具体的分析可以看这里:&&和||运算 内容如下: 一直以为 && 和 || 这两个运算符只能在判断表达式时使用,一般就是常在if语句使用。前段时间在公司的磨刀行动的考核题目中,完全做错了。由于对这两个运算符不是很理解,只是简单的认为是一个判断表达式。当时考试的题目:3||6&&9的运算结果是什么?我居然写的是true! 今天在博客园里看到了对这两个讲解,认为很多人在这里还是存在误区的。所以也把他记了下来。 我们先不看答案,先来对&& 和 || 的理解。我记得在以前的计算机书上看到过这两个运算符,他们的优先级是:&&大于|| 。那&&又是怎么运算的呢? exp1&&exp2:如果执行exp1后返回true,则执行exp2并返回exp2的值;如果执行exp1后返回false,则整个表达式返回exp1的值,exp2不执行; exp1 || exp2:如果执行exp1后返回true,则整个表达式返回exp1的值,exp2不执行;如果执行exp1后返回false,则执行exp2并返回exp2的值; 那下面我们来看答案吧: 3||6&&9:先运算&&,由于6和9都大于0,即都为true,所以结果为 9。表达式变为3||9。由于3和9 都为true,则返回3。所以答案就是3。 由上面我又延伸几个问题:false==0,true==0,false==null,false==undefined,false==""他们的值 又是什么呢? 在末尾我在给大家留个问题:&和&& 他们之间又有什么区别呢?

js 运算符 || 妙用相关推荐

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

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

  2. js运算符单竖杠“|”的用法和作用及js数据处理

    js运算符单竖杠"|"的作用 很多朋友都对双竖杠"||",了如指掌,因为这个经常用到.但是大家知道单竖杠吗?今天有个网友QQ问我,我的 javascript实用 ...

  3. JavaScript深入【表达式和运算符(上集)】你能过我8关js运算符的题目吗?

    博主留言 (茗洋芳竹) 每一个高手成功之路,都要学会怎样与孤独打交道 .我是个傻孩子,孤独竟然是我的夫人,每天晚上都会坐在我旁边看我学习,写博客.马上要离开ASP.NET生涯,投奔PHP了,一切都是那 ...

  4. 前端:JS/18/JS运算符(算术运算符,赋值运算符,字符串运算符,比较运算符,逻辑运算符,三元运算符),window.prompt()

    JS运算符 要进行各种各样的运算,就要使用不同的运算符号. 1,算术运算符:+ - * / % ++ -- + :加法运算符 - :减法运算符 * :乘法运算符 / :除法运算符 % :取余运算符,返 ...

  5. JavaScript学习笔记:JS运算符重载

    1.定义   在了解运算符重载之前,先了解一下重载.重载是指可使函数.运算符等处理不同类型数据或者接受不同个数参数的一种方法.   函数重载是指函数名相同,函数参数个数或者参数类型不同,以至于返回类型 ...

  6. 4.js运算符,js三目运算符

    js运算符 单目运算符:自增自减 自增 ++ 变量的值每次加1,再赋给变量; 自减 – 变量的值每次减1,再赋值给变量; 双目运算符: + 加 - 减 * 乘 / 除 % 求余 = 赋值 += 加等 ...

  7. 前端面试题 - JS 运算符优先级

    建议先看一下运算符分类,可以参考这篇文章:js运算符与优先级,基本上把所有的运算符以及分类都总结了出来. 借用文章的一个表格,该表格包含了所有的运算符,优先级自上而下逐渐降低,同一行优先级相同: 我们 ...

  8. js运算符单竖杠“|”的用法

    js运算符单竖杠"|"的作用 很多朋友都对双竖杠"||",了如指掌,因为这个经常用到.但是大家知道单竖杠吗?今天有个网友QQ问我,我的 javascript实用 ...

  9. JS运算符详解与优先级

    JS运算符详解与优先级 算术运算符 赋值运算符 一元运算符 比较运算符 逻辑运算符 运算符优先级 算术运算符 + 求和 - 求差 * 求积 / 求商 % 求余 取模 乘除取余优先级相同,加减优先级相同 ...

最新文章

  1. 一. 对spring boot认识
  2. 内部类调用相同属性同名时的调用细节
  3. Flutter 找不到 android sdk(图文详解)
  4. 字符串相乘Python解法
  5. VS2010中如何实现自定义MFC控件
  6. sql server链接查询
  7. 使用CodeIgniter输入类
  8. java的环境变量_java学习册|JDK|环境变量
  9. Hive中外部表的alter与drop操作的最低权限要求
  10. 2. Android Basic 搭建Android开发环境
  11. 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)
  12. 洛谷P3384 树链剖分
  13. 安信可LoRa快速入门指南
  14. 离散数学---序偶,笛卡尔积,自反,闭包
  15. Bootstrap关于导航条点击后移出此区域背景颜色变白
  16. 设置table表格四周圆角
  17. 任意阶幻方的解法及c++实现
  18. 因子分析累计贡献率_[2018年最新整理]多元统计分析之因子分析.doc
  19. otherwise 用法
  20. MacOS Ventura 13.2.1 (22D68) 正式版带 OC 0.8.9 and winPE 双分区原版黑苹果镜像

热门文章

  1. oracle11gRAC之log日志体系
  2. Hard commits, soft commits and transaction logs
  3. vmware esxi的安装
  4. Java-JUC(一):volatile引入
  5. machine learning(15) --Regularization:Regularized logistic regression
  6. Beaglebone Back学习七(URAT串口测试)
  7. [Yii Framework] Yii如何实现前后台的session分离
  8. 实现网页中增加刷新按钮、链接的方法 搜集
  9. SQL中int类型与varchar类型的隐式转换
  10. [你必须知道的.NET]第十二回:参数之惑---传递的艺术(下)