JavaScript中的与或逻辑运算,存在短路效应,这个是初学者非常容易忽视的一个特性。
这个特性简单来说,跟电路短路的原理差不多,这样就很好理解了。
&& 与(且)逻辑
(表达式a) && (表达式b) && (表达式c) && (表达式d)
需要特别注意的是!!!JS中的逻辑运算进行时,会对表达式的值,进行强制的布尔值转换,但在运算完成,会返回的并不一定是true / false,而是得到结果的那个表达式的值!!!这点非常反直觉,也是JS跟其他语言有很大区别的地方。
回到这个逻辑运算式,表达式a, b, c, d并不是一开始就全部都进行强制转换得到布尔值。要知道,且的逻辑是只要有一个false,那么全false,按照从左到右的顺序来计算,遇到第一个false就可以停了,后面不必再算,也就是会被短路。如果一直为true则执行到右边最后一个表达式,返回它的值。举个例子假如第二个表达式b转换布尔值后是false,那么会把a转化,b转化,跳过后面c,d,直接返回表达式b的值(转化为布尔值之前的)。表达式c,d中写的并不会被执行。
直接来看一段代码:
var a, b, c, d;
console.log(a, b, c, d); // undefined
console.log(a = 4); //返回赋值表达式的值4
console.log((a = 1) && (b = 0) && (c = 3) && (d = 4));
// 短路逻辑,到b=0得到false,返回表达式的值0
// 验证后两个表达式被短路了
console.log(a, b, c, d); // 1 0 undefined undefined
好了,到这里基本上就理解了JS这门语言独特的sui性了,后面的或逻辑,只是延续这个短路逻辑而已。
|| 或逻辑
(表达式a) || (表达式b) || (表达式c) || (表达式d)
与且逻辑同理,该逻辑运算会返回从左到右,第一个true的表示式的值,并短路后续运算。如果均为false,那么执行到最右边的表达式,返回该值。
var a, b, c, d;
console.log(a, b, c, d); // undefined
console.log((a = NaN) || (b = '') || (c = []) || (d = 0));
// 短路逻辑,到c=[]空数组得到true,返回表达式的值[]
// 验证后两个表达式被短路了
console.log(a, b, c, d); // NaN '' [] undefined
! 非逻辑
好在非逻辑不存在短路的问题,非逻辑会强制转化后面表达式的值,成为 true / false 二选一的布尔值,这下太清晰了。负负得正,所以前端转换布尔值的常规简便写法就变成了!!(a)
而并不是Boolean(a) 写法繁琐
附:JS中转换成false的六个特殊值,其余转换均为true
- undefined
- null
- -0
- +0
- NaN
- ‘’(空字符串) 注意,+0 和 -0 是有区别的,其实下式是成立的
0 === +0 === -0
但是但是,奇葩的是做除法计算时,二者区别就体现了
1/+0 === Infinity
1/-0 === -Infinity
从数学上来讲,+0,-0两个无穷小肯定是不同的, JS语言中就这样定义,没办法,记住它吧。