JavaScript的逻辑运算符

原文:Logical Operators in JavaScript

JavaScript有3种逻辑运算符:&&||!。这三个运算符常用在if语句,本文介绍了逻辑运算符其他的一些神奇的用法。

JavaScript有3种逻辑运算符

  • !:逻辑非
  • &&:逻辑与
  • ||:逻辑或

逻辑非

逻辑非运算符!可以检查一个值的/。简言之,真值的!v === false,以下7个为假值:

  • false
  • 0
  • 0n: BigInt 0
  • '': 空字符串
  • null
  • undefined
  • NaN
1
2
3
4
5
6
7
8
9
10
11
12
13
// 假值的 `!v === true`
!false; // true
!0; // true
!''; // true
!undefined; // true
!null; // true
!Number('abc'); // true

// 其他所有值都是真值,`!v === false`
!1; // false
!({}); // false
!({ valueOf: () => 0 }); // false
!' '; // false

||&&不同,非运算符总是返回一个Boolean。将一个值v转换为Boolean的常用方法,是进行两次逻辑非操作:

1
2
// `v`转为Boolean
!!v;

逻辑或

逻辑或运算符||操作2个值,只要有一个是真值,就返回true

1
2
3
// `a`或`b`为true,则为true。
// `a`和`b`都为false,才是false。
!!(a || b);

逻辑或运算符常用于if语句,在多个条件中的一个为true时执行if语句块。但逻辑或运算符不一定返回一个Boolean:

  • 如果a是真值,(a || b) === a
  • 如果a是假值,(a || b) === b

多个或运算符看起来很简洁:a || b || c || d返回最靠左的真值。基于此,逻辑或常用于取默认值:

1
2
3
4
5
6
7
8
9
10
11
12
13
const defaultNumReps = 2;

function repeat(str, numReps) {
// 如果`numReps`是null、undefined或0
// `numReps`会设置为默认值2
numReps = numReps || defaultNumReps;

let ret = '';
for (let i = 0; i < numReps; ++i) {
ret += str;
}
return ret;
}

逻辑与

逻辑与运算符&&操作2个值,只要有一个值是假值,就返回false

1
2
// `a`和`b`都为true,才是true
!!(a && b);

逻辑与运算符常用于if语句,在多个条件都满足时才执行if语句块。与逻辑或相似,逻辑与运算符也不一定返回一个Boolean:

  • 如果a是假值,(a && b) === a
  • 如果a是真值,(a && b) === b

多个逻辑与运算符的链a && b && c && d,会返回最靠左的假值。