JS中的短路逻辑

459 阅读3分钟

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语言中就这样定义,没办法,记住它吧。