JavaScript逻辑运算符+短路计算

逻辑运算符通常用于布尔型(逻辑)值。这种情况下,它们返回一个布尔值。
然而,&& 和 || 运算符会返回一个指定操作数的值,因此,这些运算符也用于非布尔值。这时,它们也就会返回一个非布尔型值。

逻辑运算符

expr可能是任何一种类型, 不一定是布尔值

运算符 语法 说明
逻辑与,AND(&&) expr1 && expr2 若 expr1 可转换为 true,则返回 expr2;否则,返回 expr1。
逻辑或,OR(||) expr1|| expr2 若 expr1 可转换为 true,则返回 expr1;否则,返回 expr2。
逻辑非,NOT(!) !expr 若 expr 可转换为 true,则返回 false;否则,返回 true。

尽管 && 和 || 运算符能够使用非布尔值的操作数, 但它们依然可以被看作是布尔操作符,因为它们的返回值总是能够被转换为布尔值。如果要显式地将它们的返回值(或者表达式)转换为布尔值,请使用双重非运算符(即!!)或者Boolean构造函数。

⬆️ 逻辑与,AND(&&)

即: 可以对运算符两侧的值进行运算并返回结果
两个值中只要一个为false,就返回false
只有两个值都为true,才返回true

⬆️ 逻辑或,OR(||)

即:可以对符号两侧的值进行或运算或运算并返回结果
只要有有一个true就返回true

⬆️ 逻辑非,NOT(!)

所谓非运算就是指对一个布尔值进行反操作
true变false,false变true

  • 如果对非布尔值进行该操作,则将其转换为布尔值,然后再取反
            所以我们可以利用该特点,来将一个其他数据类型转换为布尔值

  • 可以为一个任意类型数据类型取两次反,将其转换为比尔值

  • 如果对一个值两次取反,它不会变化

	const a = 3;
	const b = -2;
	const c = 4;
	//&& 两边都为true,返回true;有一个false,就返回false
	console.log(a > 0 && b > 0); //false
	console.log(a > 0 && c > 0 );//true
	console.log(a > 0 && c < 0 );//false
	//  ||有一个true就返回true
	console.log(a > 0 || b > 0); //true
    console.log(a > 0 || c > 0);//true
    console.log(a > 0 || c < 0);//true
    //(a > 0 || b > 0)为true,! 取非变为false
	console.log(!(a > 0 || b > 0)); //false

如果一个值可以被转换为 true,那么这个值就是所谓的 truthy,如果可以被转换为 false,那么这个值就是所谓的 falsy。
会被转换为 false 的表达式有:
null;
NaN;
0;
空字符串("" or ‘’ or ``);
undefined。

短路计算

由于逻辑表达式的运算顺序是从左到右,也可以用以下规则进行"短路"计算:

  • (some falsy expression) && (expr) 短路计算的结果为假。

    即:第一个值为false,则直接返回,不会再去看第二个值;
    如果第一个值为true,会检查第二个值

  • (some truthy expression) || (expr) 短路计算的结果为真。

    即:第一个值为true,则直接返回,不会再去看第二个值;
    第一个值为false,则会检查第二个值

短路意味着上述表达式中的expr部分不会被执行,因此expr的任何副作用都不会生效。
造成这种现象的原因是,整个表达式的值在第一个操作数被计算后已经确定了。

        function A() {
            console.log('called A');
            return false;
        }
        function B() {
            console.log('called B');
            return true;
        }

        console.log(A() && B()); //called A false
        console.log(B() || A()); //called B true

        console.log(A() || B()); //called A called B true
        console.log(B() && A()); //called B called A false

猜你喜欢

转载自blog.csdn.net/Sonnenlicht77/article/details/105632401