企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 一、概述 布尔运算符用于将表达式转为布尔值,一共包含四个运算符。 * 取反运算符:`!` * 且运算符:`&&` * 或运算符:`||` * 三元运算符:`?:` ## 二、取反运算符(!) 取反运算符是一个感叹号,用于将布尔值变为相反值,即`true`变成`false`,`false`变成`true`。 ~~~ !true // false !false // true ~~~ 对于非布尔值,取反运算符会将其转为布尔值。以下六个值取反后为`true`,其他值都为`false`。 * `undefined` * `null` * `false` * `0` * `NaN` * 空字符串(`''`) ~~~ !undefined // true !null // true !0 // true !NaN // true !"" // true !54 // false !'hello' // false ![] // false !{} // false ~~~ ## 三、且运算符(&&) 且运算符(`&&`)往往用于多个表达式的求值。 它的运算规则是:如果第一个运算子的布尔值为`true`,则返回第二个运算子的值(注意是值,不是布尔值);如果第一个运算子的布尔值为`false`,则直接返回第一个运算子的值,且不再对第二个运算子求值。 ~~~ 't' && '' // "" 't' && 'f' // "f" 't' && (1 + 2) // 3 '' && 'f' // "" '' && '' // "" var x = 1; (1 - 1) && ( x += 1) // 0 x // 1 ~~~ 上面代码的最后一个例子,由于且运算符的第一个运算子的布尔值为`false`,则直接返回它的值`0`,而不再对第二个运算子求值,所以变量`x`的值没变。这种跳过第二个运算子的机制,被称为“短路”。 且运算符可以多个连用,这时返回第一个布尔值为`false`的表达式的值。如果所有表达式的布尔值都为`true`,则返回最后一个表达式的值。 ~~~ true && 'foo' && '' && 4 && 'foo' && true // '' 1 && 2 && 3 // 3 ~~~ 上面代码中,例一里面,第一个布尔值为`false`的表达式为第三个表达式,所以得到一个空字符串。例二里面,所有表达式的布尔值都是`true`,所有返回最后一个表达式的值`3`。 ## 四、或运算符(||) 或运算符(`||`)也用于多个表达式的求值。它的运算规则是:如果第一个运算子的布尔值为`true`,则返回第一个运算子的值,且不再对第二个运算子求值;如果第一个运算子的布尔值为`false`,则返回第二个运算子的值。 ~~~ 't' || '' // "t" 't' || 'f' // "t" '' || 'f' // "f" '' || '' // "" ~~~ 短路规则对这个运算符也适用。 ~~~ var x = 1; true || (x = 2) // true x // 1 ~~~ 上面代码中,或运算符的第一个运算子为`true`,所以直接返回`true`,不再运行第二个运算子。所以,`x`的值没有改变。这种只通过第一个表达式的值,控制是否运行第二个表达式的机制,就称为“短路”(short-cut)。 或运算符可以多个连用,这时返回第一个布尔值为`true`的表达式的值。如果所有表达式都为`false`,则返回最后一个表达式的值。 ~~~ false || 0 || '' || 4 || 'foo' || true // 4 false || 0 || '' // '' ~~~ ## 五、三元条件运算符(? :) 三元条件运算符由问号(?)和冒号(:)组成,分隔三个表达式。它是 JavaScript 语言唯一一个需要三个运算子的运算符。如果第一个表达式的布尔值为`true`,则返回第二个表达式的值,否则返回第三个表达式的值。 ~~~ 't' ? 'hello' : 'world' // "hello" 0 ? 'hello' : 'world' // "world" ~~~ 通常来说,三元条件表达式与`if...else`语句具有同样表达效果,前者可以表达的,后者也能表达。但是两者具有一个重大差别,`if...else`是语句,没有返回值;三元条件表达式是表达式,具有返回值。所以,在需要返回值的场合,只能使用三元条件表达式,而不能使用`if..else`。