a && b : 将a, b转换为Boolean类型, 再执行逻辑与, true返回b, false返回a
a || b : 将a, b转换为Boolean类型, 再执行逻辑或, true返回a, false返回b
转换规则:
对象为true
非零数字为true
非空字符串为true
其他为false

/**
* 几乎所有语言中||和&&都遵循“短路”原理,
* 如&&中第一个表达式为假就不会去处理第二个表达式,而||正好相反。
* js也遵循上述原则。
* 当||时,找到为true的分项就停止处理,并返回该分项的值,否则执行完,并返回最后分项的值。
* 当&&时,找到为false的分项就停止处理,并返回该分项的值。
**/
var a = "" || null || 3 || 4;//
alert(a);
var b = 4 && 5 && null && "0";//null
alert(b);

今天看了一段压缩的js代码:

Site.positionManifestoSlides = function() {
Site.manifesto_height = Site.first_manifesto_slide.outerHeight(),
Site.manifestos_height = Site.manifesto_height * Site.manifestos_n,
Site.manifesto_start = Site.manifestos_container.offset().top,
Site.manifesto_end = Site.manifesto_start + Site.manifestos_height,
Site.manifestos_container.height(Site.manifestos_height);
var e = $(window).height(),
t = $(window).scrollTop(),
n = Site.header.outerHeight(),
i = .5 * (e + n - Site.manifesto_height),
o = .5 * (Site.manifesto_height - e + n),
r = t - Site.manifesto_start + i;
if (r >= 0 && r < Site.manifestos_height && $(window).width() > 768) {
var a = Math.floor(r / Site.manifesto_height) + 1,
s = "block";
a >= Site.manifestos_n && (a = Site.manifestos_n - 1, s = "none"),
Site.manifestos.each(function(t) {
var n = $(this);
t > a && n.css({
top: e,
position: "fixed",
"z-index": 10,
display: "block"
}),
a == t && n.css({
top: e - (r - Site.manifesto_height * (a - 1)) + o,
position: "fixed",
"z-index": 100,
display: "block"
}),
a > t && n.css({
top: i,
position: "fixed",
"z-index": 11 + t,
display: s
})
})
} else Site.manifestos.css({
top: 0,
position: "relative",
"z-index": 0,
display: "block"
})
},

直接疯掉了,估计一下子没几个人能看懂。那么就把他“翻译”一下。

&& (逻辑与)

这里主要是一个“&&”运算,首先要搞懂这个,看一个简单的例子:

 
1 var a = 1 && 2 && 3;//3
2 var b = 0 && 1 && 2;//0
3 var c = 1 && 0  && 2;//0
4 alert(a),alert(b),alert(c);

嘿嘿,写法很奇怪,运行的结果是3,0,0。一般我们在if语句中经常用到。“&&” (逻辑与) 运算和“||”运算真好相反,“&&” 运算遇到false就返回。
例如: a && b ,如果 a 为true,直接返回b,而不管b为true或者false 。如果 a 为false
那么直接返回a,上面例子中第一个var a = 1 && 2 && 3;因为1 &&
2,1为真,返回2;2&&3, 2为真,返回3 。

||(逻辑或)

再来看看“||”(逻辑或)运算,看例子:

 
1 var a = 0 || 1 || 2;//1
2 var b = 1 || 0 || 3;//1
3 alert(a),alert(b);

“||”运算遇到true就返回。例如:a || b ,如果 a 为false,直接返回b,而不管b为true或者false ,如果为a || b ||c   a为false, b为true则 返回b , 如果b为false,  直接返回c,而不管c为true或者false  。如果 a 为true,直接返回a,而不会继续往下执行。

&& (逻辑与) 和||(逻辑或)混合使用的时候要注意他们的优先级:

&& (逻辑与) 优先级高于||(逻辑或)
return a && b || c ,
根据a来判断返回值,a 是 false 则肯定返回 c;如果 b , c 都是 true ,那么我们就可以根据 a 来决定b 还是 c ,如果 a 是 false 则返回 c,如果a是true 则返回 b。
return a || b && c
根据优先级相当于先算 b && c ,然后和a 相 或;如果a是true,则返回a,不论是b或c,如果a是false,则如果b是false,返回b,如果b是true,返回c;

 
1 var
a = 3  &&  0 || 2;  
//2
3 var
b = 3 || 0  &&  2;
// 3
5 var
c= 0 || 2 && 3;
// 3
6 alert(a),alert(b),alert(c);

另附:JS运算符优先级(从高到低列出)

运算符 描述
. [] () 字段访问、数组下标、函数调用以及表达式分组
++ -- - ~ ! delete new typeof void 一元运算符、返回数据类型、对象创建、未定义值
* / % 乘法、除法、取模
+ - + 加法、减法、字符串连接
<< >> >>> 移位
< <= > >= instanceof 小于、小于等于、大于、大于等于、instanceof
== != === !== 等于、不等于、严格相等、非严格相等
& 按位与
^ 按位异或
| 按位或
&& 逻辑与
|| 逻辑或
?: 条件
= oP= 赋值、运算赋值
, 多重求值

S运算符&&和|| 及其优先级的更多相关文章

  1. Mysql 中Left/Right join on后面and和where条件查询的差异-Mysql SQL运算符是有优先级

    一.Mysql中Left/Right join on后面and和where条件查询的差异 1.建两张测试表,一张商户定义表.一张商户操作状态明细表 1)商户定义表 CREATE TABLE hope. ...

  2. input、raw_input区别,运算符,运算优先级,多变赋值方式

    目录 1. Python2中的input.raw_input赋值方式和Python3中的input赋值方式的差别 2. 运算符 3. python运算符优先级 4. 格式化输出 5. 链式赋值 6. ...

  3. 运算符 Operator 及优先级

    算数运算符 + - * / ** % /表示自然除,结果是浮点数.//为整除.python2.x版本/和//都是整除. 位运算符 & | ~ ^ << >> <& ...

  4. [转] JS运算符 &&和|| 及其优先级

    第一.&& (逻辑与)运算,看一个简单的例子: var a = 1 && 2 && 3; var b = 0 && 1 &&am ...

  5. C语言运算符表(优先级)

    http://www.is.pku.edu.cn/~qzy/c/operator.htm

  6. C语言运算符和优先级

    关于C语言运算符和优先级,经整理众多博客资料汇入自己的实战,如下:        a.算术运算        C语言一共有34种运算符,包括常见的加减乘除运算.        1) 加法:+ 还可以表 ...

  7. js 运算符优先级

    在看jquery源码,仔细看入口函数的时候,有点懵了.看到与或.多重三目,傻傻的分不清,就代码仔细的区分下运算符优先级,以前都是呼呼的飘过.看来任何一个细节都不能忽略,不然效率极低.. !functi ...

  8. swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)

    swift:高级运算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和 ...

  9. python运算符的优先级

    运算符优先级 如果你有一个如2 + 3 * 4那样的表达式,是先做加法呢,还是先做乘法?我们的中学数学告诉我们应当先做乘法——这意味着乘法运算符的优先级高于加法运算符. 下面这个表给出Python的运 ...

随机推荐

  1. Miller-Rabin素性测试|Pollard's Rho算法

    Miller-Rabin 素性测试 Miller-Rabin 素数测试 一本通上的M-R不透彻啊~ Miller-Rabin是利用随机化算法判断一个数是合数还是素数. 首先,如果一个数N是素数,那么他 ...

  2. MySQL的复制:MySQL系列之十三

    一.MySQL复制相关概念 主从复制:主节点将数据同步到多个从节点 级联复制:主节点将数据同步到一个从节点,其他的从节点在向从节点复制数据 同步复制:将数据从主节点全部同步到从节点时才返回给用户的复制 ...

  3. KVM虚拟机CPU绑定性能调优(宿主机上操作)

    获取kvm的pid ps -ef | grep kvm 通过pid找到vcpu在那个物理cpu上,没有绑定固定物理cpu时,执行下面命令可以看出vcpu在不同的物理cpu上切换重复执行 ps -eLo ...

  4. Codeforces Round #363 (Div. 2) C

    Description Vasya has n days of vacations! So he decided to improve his IT skills and do sport. Vasy ...

  5. Helvetic Coding Contest 2016 online mirror B1

    Description The zombies are gathering in their secret lair! Heidi will strike hard to destroy them o ...

  6. LeetCode 583 Delete Operation for Two Strings 删除两个字符串的不同部分使两个字符串相同,求删除的步数

    Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 t ...

  7. Vertical roller mill from SBM

    Vertical roller mill has many different forms, but it works basically the same. All of these forms o ...

  8. springboot相关的pom依赖文件

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  9. <checking for mysql_config not found>

    php 5.3.29编译安装排错: ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --w ...

  10. WebApi 实例

    REST是设计风格而不是标准. webapi有自己的路由. webservice和wcf的协议都是soap协议,数据的序列化和反序列化都是soap的格式.而webapi是Json的数据传递 webap ...