# 布尔运算符
# 概述
布尔运算符用于将表达式转为布尔值,一共包含四个运算符。
- 取反运算符:!
- 且运算符:&&
- 或运算符:||
- 三元运算符:?:
# 非(!)
!true // false
!false // true
1
2
2
对于非布尔值,取反运算符会将其转为布尔值。可以这样记忆,以下六个值取反后为true,其他值都为false。
!undefined // true
!null // true
!0 // true
!NaN // true
!"" // true
!false // true
!54 // false
!'hello' // false
![] // false
!{} // false
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
两次取反就是将一个值转为布尔值的简便写法。
!!x
// 等同于
Boolean(x)
1
2
3
2
3
# 且(&&)
# 1. 且的基本理论
它的运算规则是:如果第一个运算子的布尔值为true,则返回第二个运算子的值(注意是值,不是布尔值);如果第一个运算子的布尔值为false,则直接返回第一个运算子的值,且不再对第二个运算子求值。
't' && '' // ""
't' && 'f' // "f"
't' && (1 + 2) // 3
'' && 'f' // ""
'' && '' // ""
var x = 1;
(1 - 1) && ( x += 1) // 0
x // 1
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 2. 且的短路效应
这种跳过第二个运算子的机制,被称为“短路”。有些程序员喜欢用它取代if结构,比如下面是一段if结构的代码,就可以用且运算符改写。
if (i) {
doSomething();
}
// 等价于
i && doSomething();
1
2
3
4
5
6
7
2
3
4
5
6
7
# 3. 且的连用
且运算符可以多个连用,这时返回第一个布尔值为false的表达式的值。如果所有表达式的布尔值都为true,则返回最后一个表达式的值。
true && 'foo' && '' && 4 && 'foo' && true
// ''
1 && 2 && 3
// 3
1
2
3
4
5
2
3
4
5
# 或(||)
# 1. 或的基本理论
或运算符(||)也用于多个表达式的求值。它的运算规则是:如果第一个运算子的布尔值为true,则返回第一个运算子的值,且不再对第二个运算子求值;如果第一个运算子的布尔值为false,则返回第二个运算子的值。
't' || '' // "t"
't' || 'f' // "t"
'' || 'f' // "f"
'' || '' // ""
1
2
3
4
2
3
4
# 2. 或的短路效应
var x = 1;
true || (x = 2) // true
x // 1
1
2
3
2
3
# 3. 或的连用
或运算符可以多个连用,这时返回第一个布尔值为true的表达式的值。如果所有表达式都为false,则返回最后一个表达式的值。
false || 0 || '' || 4 || 'foo' || true
// 4
false || 0 || ''
// ''
1
2
3
4
5
2
3
4
5
# 4. 函数变量默认值
function saveText(text) {
text = text || '';
// ...
}
// 或者写成
saveText(this.text || '')
1
2
3
4
5
6
7
2
3
4
5
6
7
# 三元条件运算符(?:)
三元条件运算符由问号(?)和冒号(:)组成,分隔三个表达式。它是 JavaScript 语言唯一一个需要三个运算子的运算符。如果第一个表达式的布尔值为true,则返回第二个表达式的值,否则返回第三个表达式的值。
't' ? 'hello' : 'world' // "hello"
0 ? 'hello' : 'world' // "world"
1
2
2