逻辑运算符(布尔运算符)用于将表达式转换为布尔值
运算符 | 语法 | 详解 |
逻辑与 ,AND(&&) | 表达式1 && 表达式2 | 如果表达式1可以转换为 true,就返回表达式2;否则,返回表达式1 |
逻辑或,OR(||) | 表达式1 || 表达式`2 | 如果表达式1可以转换为 true,则返回表达式1; 否则,返回表达式2 |
逻辑非,NOT(!) | !表达式 | 如果表达式可以转换为 true,则返回 false;否则,返回 true |
如果一个值可以被转换为 true,那么这个值就是 真的,如果可以被转换为 false ,那么这个值就是所谓的 falsy。
会被转换为 false 的表达式有:null;NaN;0;空字符串(" " 或 ' ' 或 ` `);undfined
尽管 && 和 || 运算符能够使用非布尔值的操作符,但是仍然被看作是布尔操作符,因为它们的返回值总是能够被转换为布尔值。
如果要显式地将它们的返回值(或是表达式)转换为布尔值,可以使用 双重非运算符( !! )或者是 Boolean 函数
短路计算
由于逻辑表达式的运算顺序是从左向右,也可以使用以下规则进行 ’ 短路 ‘ 计算:
1、为假的表达式 && expr 短路计算结果为 false
2、为真的表达式 || expr 短路计算结果为 true
短路意味着上述表达式中的 逻辑运算符后面的表达式不会被执行,因此后面的 expr 并不会生效。
整个表达式的值在第一个操作数被计算后就已经确定了。
短路与
逻辑与操作属于短路操作,即第一个操作数可以决定结果,那么就不会在对第二个操作数求值。
对于逻辑和操作而言,如果第一个操作数是 false,则无论第二个操作数是什么值,结果都不再可能是 true。
false && true //直接返回 false
短路或
和短路与操作符相似,逻辑或操作符也是短路操作符。
第一个操作数的求值结果为 true,就不会对第二个操作数求值了。
true || false //直接返回 true
逻辑非运算符 NOT
逻辑非运算符由一个叹号( ! )表示,可以用于ECMAScript 中的任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。
逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反。
逻辑非操作符遵循下列规则:
1、如果操作数是一个对象,返回 false
2、如果操作数是一个空字符串,则返回 true
3、如果操作数是非空字符串,返回 false
4、如果操作数是数值 0,返回 true
5、如果操作数是任意非0数值(包括 Infinity),返回 false
6、如果操作数是 null,返回 true
7、如果操作数是 NaN,返回 true
8、如果操作数是 undefined,返回 true。
实例:
!true // !t 返回 false !false // !f 返回 true !'' // !f 返回 true !'Cat' // !t 返回 false !0 //返回 true !Infinity //返回false !null //返回 true !NaN //返回 true !undefined //返回 true
双重非运算符
双重非运算符是由两个叹号( !! )表示。
逻辑非运算符可以用于将一个值转换为与其相对应的布尔值,同时使用两个逻辑非操作符,实际上就会模拟 Boolean( ) 转型函数的行为。
其中,第一个逻辑非操作符会在无论什么操作数的情况下,都会返回一个布尔值。第二个逻辑非操作符对该布尔值求反,于是就得到了这个值真正对应的布尔值。
最终结果与使用函数 Boolean( ) 效果相同。
n1 = !!true // !!truthy 返回 true n2 = !!{} // !!truthy 返回 true: 任何 对象都是 truthy 的… n3 = !!(new Boolean(false)) // …甚至 .valueOf() 返回 false 的布尔值对象也是! n4 = !!false // !!falsy 返回 false n5 = !!"" // !!falsy 返回 false n6 = !!Boolean(false) // !!falsy 返回 false
逻辑与运算符 AND
逻辑与操作符使用两个和号表示( && ),有两个操作数
逻辑与的真值表
第一个操作数 | 第二个操作数 | 结果 |
true | true | true |
true | false | false |
false | true | false |
false | false | false |
逻辑与操作可以应用于任何类型的操作数,不仅仅是布尔值。
在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;此时,它遵循下列规则:
1、如果第一个操作数是对象,则返回第二个操作数;
2、如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象;
3、如果两个操作数都是对象,则返回第二个操作数;
4、如果第一个操作数是 null,则返回的是 null;
5、如果第一个操作数是 NaN,则返回的是 NaN
6、如果第一个操作数是 undefined,则返回 undefined。
实例:
true && true // t && t 返回 true true && false // t && f 返回 false false && true // f && t 返回 false false && (3 == 4) // f && f 返回 false "aa" && "bb" // t && t 返回 "bb" false && "aa" // f && t 返回 false "Cat" && false // t && f 返回 false '' && false // f && f 返回 "" false && '' // f && f 返回 false null && null // 返回 null NaN && NaN // 返回 NaN undefined && undefined // 返回 undefined
逻辑或运算符 OR
逻辑或操作符由两个竖线符号( || )表示,有两个操作符。
逻辑或的真值表如下:
第一个操作 | 第二个操作数 | 结果 |
true | true | true |
true | false | true |
false | true | true |
false | false | false |
和逻辑与操作类似,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值。
逻辑或运算遵循以下规则:
1、如果第一个操作数是对象,则返回第一个操作数
2、如果第一个操作数的求值结果为 false,则返回第二个操作数
3、如果两个操作数都是对象,则返回第一个操作数;
4、如果两个操作数都是 null,则返回 null;
5、如果两个操作数都是 NaN,则返回 NaN;
6、如果两个操作数都是 undefined,则返回 undefined;
实例:
true || true // t || t 返回 true false || true // f || t 返回 true true || false // t || f 返回 true false || (3 == 4) // f || f 返回 false "aa" || "bb" // t || t 返回 "aa" false || "aa" // f || t 返回 "aa" "Cat" || false // t || f 返回 "Cat" '' || false // f || f 返回 false false || '' // f || f 返回 "" undefined || undefined //返回 undefined null || null //返回 null NaN || NaN //返回 NaN
布尔值转换规则
1、将 AND 转换为 OR
aa && bb
等价于
!(!aa || !bb)
2、将 OR 转换为 AND
aa || bb
等价于
!(!aa && !bb)
3、逻辑运算符的优先级(运算符从左向右从大到小依次排列)
逻辑非!> 逻辑与&& > 逻辑与 ||
console.log(false && true || true) //返回 true console.log(false && (true || true)) //返回 false
参考资料:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators
《JavaScript高级程序设计》