zoukankan      html  css  js  c++  java
  • js中的 || 与 && 运算符详解

    js中逻辑运算符在开发中可以算是比较常见的运算符了,主要有三种:逻辑与&&、逻辑或||和逻辑非!。

    当&&和|| 连接语句时,两边的语句会转化为布尔类型(Boolean),然后再进行运算,具体的运算规则如下:

    1.&&

    1.1两边条件都为true时,结果才为true;
    1.2如果有一个为false,结果就为false;
    1.3当第一个条件为false时,就不再判断后面的条件

    注意:当数值参与逻辑与运算时,结果为true,那么会返回的会是第二个为真的值;如果结果为false,返回的会是第一个为假的值。

    2.||

    2.1只要有一个条件为true时,结果就为true;
    2.2当两个条件都为false时,结果才为false;
    2.3当一个条件为true时,后面的条件不再判断

    注意:当数值参与逻辑或运算时,结果为true,会返回第一个为真的值;如果结果为false,会返回第二个为假的值;

    3.!

    3.1当条件为false时,结果为true;反之亦然。

    上代码说明:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    <!DOCTYPE html>

    <html lang="en">

    <head>

      <meta charset="UTF-8">

      <title>demo</title>

      <script>

        console.log( 5 && 4 );//当结果为真时,返回第二个为真的值4

        console.log( 0 && 4 );//当结果为假时,返回第一个为假的值0

        console.log( 5 || 4 );//当结果为真时,返回第一个为真的值5

        console.log( 0 || 0 );//当结果为假时,返回第二个为假的值0

        console.log((3||2)&&(5||0));//5

        console.log(!5);//false

      </script>

    </head>

    <body>

      

    </body>

    </html>

    补充:逻辑与的优先级是高于逻辑或的;

    比如console.log(3||2&&5||0),会先算2&&5的值为5,然后再3||5----3,最后再3||0----3,所以最终结果为3.

    补充

    表达式a && 表达式b :  计算表达式a(也可以是函数)的运算结果,
                          如果为 True, 执行表达式b(或函数),并返回b的结果;
                          如果为 False,返回a的结果;

    表达式a || 表达式b :   计算表达式a(也可以是函数)的运算结果,
                          如果为 Fasle, 执行表达式b(或函数),并返回b的结果;
                          如果为 True,返回a的结果;

    转换规则:

    对象为true;
    非零数字为true;

    零为false;

    非空字符串为true;
    空字符串为法false;
    其他为false;

    例如:
    var  a =  obj || " "  ;     //如果 obj 为空,a就赋值为 " " ;
    var  a = check() &&  do();    //如果check()返回为真,就执行do(),并将结果赋值给 a;

    其他网友的补充

    今天复习js继承的时候发现了一个问题,先上代码了

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    <script type="text/javascript">

     window.onload = function () {

      var mama,

      mama1,

      test = function (name) {

      debugger;

      this.name = name || 'mama';

      };

      debugger;

      mama = new test();

      mama1 = new test("mama1");

      alert(mama.name);//name = mama

      alert(mama1.name);// name = mama1

     }

     </script>

    在执行构造函数的时候,无参的构造函数返回的name是'mama',有参数时,实例的name就是参数值了。
    这个时候我就有点犯迷糊了,为什么逻辑运算符||能这么用呢?
    由于是C#出身,所以对js ||这样用感觉很奇怪。
    没辙,不懂先研究,实验实验就知道了。

    1

    2

    3

    4

    var b, c, d;

      b = true || 0;//b=true;

      c = false || 0;//c=0;

      d = 1 || 0;//d=1;

    换成别的呢?

    1

    2

    3

    4

    var b, c, d;

      b = 1-1 || 1+1; //b=2

      c = function () { return undefined } || function () { return 1};//c=function();

      d = c();//d=undefined

    1

    2

    3

    4

    var b, c, d;

      b = 1-1 || 1+1; //b=2

      c = function () { return 1 } || function () { return undefined};//c=function();

      d = c();//d=1

    1

    b = {} || { a: 1, getA: function () { return this.a}}; //b=object

    1

    2

    3

    var b, c, d;

      b = { a: 1, getA: function () { return this.a } } || {}; //b=object

      c = b.getA();//c=1;

    通过这几个实验,可以看出,JS的||并不是像C#里面的||一样 单纯的返回一个布尔类型。
    大家都知道js的布尔类型判定是对象是true,非零是true,非空字符串是true其余的都是false

     由此得出
    逻辑或 ||  : var a = 表达式1 || 表达式2

          表达式1    表达式2    a取值
            1          0      表达式1结果值
            1        1      表达式1结果值
            0        1      表达式2结果值
            0        0      表达式2结果值
     

    逻辑与 &&  : var a = 表达式1 && 表达式2

          表达式1    表达式2    a取值

            1          0      表达式2结果值
            1        1      表达式2结果值
            0        1      表达式1结果值
            0        0      表达式1结果值

    主要原因是因为短路,逻辑或 || 在前面有一个ture的时候则不看后面直接停止,逻辑与&&同理。
    然后计算赋值和我们平时一样之获取最新的一次计算结果值。

    例如

    1

    b = (1 + 1, 2 + 2, 3 + 3);//b=6;

  • 相关阅读:
    【BZOJ4236】JOIOJI(前缀和)
    【BZOJ3351】[IOI2009] regions(设阈值+分块)
    【BZOJ3992】[SDOI2015] 序列统计(原根+NTT+倍增)
    【洛谷5070】[Ynoi2015] 即便看不到未来(树状数组)
    【BZOJ4908】[BeiJing2017] 开车(分块)
    【BZOJ3730】震波(点分树)
    【洛谷4075】[SDOI2016] 模式字符串(点分治+哈希)
    【BZOJ4402】Claris的剑(组合数学)
    【BZOJ4767】两双手(容斥+DP)
    【BZOJ3601】一个人的数论(莫比乌斯反演+高斯消元)
  • 原文地址:https://www.cnblogs.com/wjlbk/p/12884671.html
Copyright © 2011-2022 走看看