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;//3 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" })},
直接疯掉了,估计一下子没几个人能看懂。那么就把他“翻译”一下。
&& (逻辑与)
这里主要是一个“&&”运算,首先要搞懂这个,看一个简单的例子:
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 。
||(逻辑或)
再来看看“||”(逻辑或)运算,看例子:
“||”运算遇到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;
6 | alert(a),alert(b),alert(c); |
另附:JS运算符优先级(从高到低列出)
运算符 | 描述 |
. [] () | 字段访问、数组下标、函数调用以及表达式分组 |
++ -- - ~ ! delete new typeof void | 一元运算符、返回数据类型、对象创建、未定义值 |
* / % | 乘法、除法、取模 |
+ - + | 加法、减法、字符串连接 |
<< >> >>> | 移位 |
< <= > >= instanceof | 小于、小于等于、大于、大于等于、instanceof |
== != === !== | 等于、不等于、严格相等、非严格相等 |
& | 按位与 |
^ | 按位异或 |
| | 按位或 |
&& | 逻辑与 |
|| | 逻辑或 |
?: | 条件 |
= oP= | 赋值、运算赋值 |
, | 多重求值 |
今天看了一段压缩的js代码:
直接疯掉了,估计一下子没几个人能看懂。那么就把他“翻译”一下。
&& (逻辑与)
这里主要是一个“&&”运算,首先要搞懂这个,看一个简单的例子:
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运算符优先级(从高到低列出)