4.10 逻辑表达式
逻辑运算符 && || !是对操作数进行布尔算术运算,经常和关系运算符一起配合使用。
4.10.1 逻辑与(&&)
&& 运算符可以从三个不同层次进行理解:
var p ={x:1}
p.y && p.x //左边假值;没有定义,undefined返回
null && p.x //null
3 && null //null
3 && 2 //2
&& 的行为有时称作短路,很多代码利用这一特性来有条件的执行代码:
if(a == b) stop();
-----------等价
(a == b) && stop();
注意一点,当&&右侧表达式具有副作用的时候(赋值、递增、递减和函数调用表达式)要格外小心,因为这些带有副作用的表达式的执行依赖于左操作数的计算结果。
|
4.10.2 逻辑或||
||运算符对两个操作数做布尔或运算,如果其中一个或者两个操作数是真值,返回一个真值,如果两个操作数都是假值,返回一个假值。
和&& 类似,|| 并不仅仅会做布尔值的运算,它也具有一些更复杂的行为。
如果||的左操作数是真值,则返回这个真值;左操作数是假值,此时依赖右操作数,计算右侧表达式并返回值
3 || 2 //3
null || undefined //undefined
null || 3 //3
右操作数依赖左操作数,所有和&&一样,应该避免右操作数包含一些具有副作用的表达式,除非目的明确的在右侧使用带副作用的表达式。
var max = max_width || preference.max_width || 500;
通常用在函数体中,用来给参数提供默认值:
function copy(o,p){
p = p || {};
}
|
4.10.3 逻辑非(!)
! 运算符是一元运算符。它防止在一个单独的操作数之前,目的是将操作数的布尔值进行求反。“!”与“&&”和“||”不同,“!”运算符首先将其操作数转换为布尔值,然后再对布尔值求反,也就是说“!”只返回布尔值true或false,通过两次求反得到的是一个等价的布尔值:!!x.
"!"具有很高的优先级,如果希望对q && p求反,则需要使用圆括号:!(p && q)
!(p && q) === !p || !q
!(p || q) === !p && !q
|