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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起伏羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值