js 与或运算符

假设对成长速度显示规定如下: 成长速度为5显示1个箭头; 成长速度为10显示2个箭头; 成长速度为12显示3个箭头; 成长速度为15显示4个箭头; 其他都显示都显示0各箭头。 用代码怎么实现?
差一点的if,else: Js代码

复制代码 代码如下:

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: Js代码

复制代码 代码如下:

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强大的表现力吧: Js代码

复制代码 代码如下:

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

更强大的,也更优的:
Js代码

复制代码 代码如下:

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

第二个需求:
Js代码

复制代码 代码如下:

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中的代码吧:
Js代码

复制代码 代码如下:

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") &&     [ 2jnkll|;
gu6j|;
mbng|;
vnfj|;
u8tu|;
kjhui|;
nbn8|;
gtr5|;
54fggdf|;
67fdg|;
187fgdf|;
fd65|;
324e|;
dfse|;
dfess|;, "<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源代码中还有很多如此精妙的代码,大家可以去学习学习。

时间: 2024-11-07 01:08:06

js 与或运算符的相关文章

JS中的运算符&amp;JS中的分支结构

一.JS中的运算符 1.算术运算(单目运算符) + 加.- 减.* 乘./ 除.% 取余.++ 自增.-- 自减 >>> +:有两种作用,连接字符串/加法运算.当+两边全为数字时,进行加法运算: 当+两边有任意一边为字符串时,起连接字符串的作用,连接之后的结果为字符串 除+外,其余符号运算时,会先尝试将左右变量用Number函数转为数字 >>> /: 结果会保留小数点 >>> ++: 自增运算符,将变量在原有基础上+1: --: 自减运算符,将变量在原

Javascript开发技巧(JS入门、运算符、分支结构、循环结构)

一.Js简介和入门 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JavaScript简介</title> <!-- [使用JS的三种方式] 1.HTML标签中内嵌JS(不提倡使用): <button onclick="javascript:alert('小碧池!你真点啊!')">有本事点我呀!!!<

【转载】js 与或运算符 || &amp;&amp; 妙用

js 与或运算符 || && 妙用,可用于精简代码,降低程序的可读性. 首先出个题: 如图: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头: 成长速度为10显示2个箭头: 成长速度为12显示3个箭头: 成长速度为15显示4个箭头: 其他都显示都显示0各箭头. 用代码怎么实现? 差一点的if,else: Js代码 代码如下: var add_level = 0; if(add_step == 5){  add_level = 1; } else if(add_step == 10)

js 与或运算符 || &amp;&amp; 妙用

js 与或运算符 || && 妙用,可用于精简代码,降低程序的可读性. http://www.jb51.net/article/21339.htm 如图:  假设对成长速度显示规定如下: 成长速度为5显示1个箭头: 成长速度为10显示2个箭头: 成长速度为12显示3个箭头: 成长速度为15显示4个箭头: 其他都显示都显示0各箭头. 用代码怎么实现? 两种方法:if 和 switch var add_level = 0; if(add_step == 5){ add_level = 1; }

js中的运算符和条件语句

js中的运算符大体上可以分为4类:1算术运算符.2一元操作符.3比较运算符.4逻辑运算符. 算术运算符一般指的是加减乘除求余这五种操作符:+,-,*,/,%.通过算术运算符可以对js中的变量进行操作.如: var a=100,b,c,d,e,f; b= a+10; //110 c=a-10; //90 d=a*10; //1000 e=a/10; //10 f=a%3; //1 一元操作符指的是只能操作一个值的操作符:如i++,i--,++i,--i;在这里要注意区别i++与++i: var a

JS中的运算符和JS中的分支结构

JS中的运算符 1.算术运算(单目运算符) + .-.*. /. %取余.++自增 .--自减 +:两种作用,链接字符串/加法运算.当+两边全为数字时,进行加法运算:当+两边有任意一边为字符串时,起链接字符串作用, 链接之后的结果为字符串. 除+外,其余符号运算时,会先尝试将左右变量用Number函数转为数字: /:结果会保留小数点. ++:自增运算符,将变量在原有基础上+1: --:自增运算符,将变量在原有基础上-1: [a++和++a的异同] ①相同点:无论a++还是++a,运算完以后,a的

js语法中运算符的二义性之逗号&ldquo;,&rdquo;的二义性

看到<js语言精髓与编程实践>中讲解的js语法中运算符的二义性之逗号的二义性,做些笔记 我们先来看看这两个例子: alert(eval('a=(1,2,3);'));//示例1 alert(eval('a=1,2,3;'));//示例2 结果是两者都会弹出3,这种用法产生的混乱,是因为逗号","既可以是语法分隔符,又可以是运算符所导致的.在上面的示例1,示例2中,逗号都被作为"连续运算符"在使用.示例1中的括号强制运算符,因此它的效果是运算如下表达式:

JS的位运算符

重温整数 ECMAScript整数有两种类型,有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在ECMAScript中,所有整数字面量默认都是有符号整数. 有符号整数,数值范围从-2147483648到2147483647:无符号整数,数值范围从0到4294967295.记住,所有整数字面量都默认存储为有符号整数,只有ECMAScript的位运算符才能创建无符号整数. 把无符号整数转换为字符串,只返回有效位.也就是前面都是0的就不返回了. var i = 18, j = -18; a

JS按位非(~)运算符与~~运算符的理解分析

按位非运算符,简单的理解就是改变运算数的符号并减去1,当然,这是只是简单的理解能转换成number类型的数据. 那么,对于typeof var!==”number”的类型来说,进行运算时,会尝试转化成32位整形数据,如果无法转换成整形数据,就转换为NaN: JS在位运算上用了更简便的一种方法来实现这中运算,那么它的实现原理大致上可以这样理解:  var testData=-2.9; var testResult=(typeof testData==="number"&&

JS变量,运算符,控制语句

一.变量: 变量命名规则 1:首字母必须以下划线_.字母.$开头 2:中间可以是字母/数字/下划线_ 全局变量.局部变量.显式变量[必须先声明].隐式变量[不必声明] 声明变量的关键字 变量名 赋值 值var width = 100; 变量类型undefined nullbooleanstringnumber typeof运算符返回值如下:undefined:变量被声明后,但未被赋值string:用单引号或双引号来声明的字符串boolean:true或falsenumber:整数或浮点数obje