zoukankan      html  css  js  c++  java
  • S运算符&&和|| 及其优先级

    a && b : 将a, b转换为Boolean类型, 再执行逻辑与, true返回b, false返回a
    a || b : 将a, b转换为Boolean类型, 再执行逻辑或, true返回a, false返回b
    转换规则:
    对象为true
    非零数字为true
    非空字符串为true
    其他为false

    /**
    * 几乎所有语言中||和&&都遵循“短路”原理,
    * 如&&中第一个表达式为假就不会去处理第二个表达式,而||正好相反。
    * js也遵循上述原则。
    * 当||时,找到为true的分项就停止处理,并返回该分项的值,否则执行完,并返回最后分项的值。
    * 当&&时,找到为false的分项就停止处理,并返回该分项的值。
    **/
     var a = "" || null || 3 || 4;//3
     alert(a);
     var b = 4 && 5 && null && "0";//null
     alert(b);

    今天看了一段压缩的js代码:

    Site.positionManifestoSlides = function() {
        Site.manifesto_height = Site.first_manifesto_slide.outerHeight(),
        Site.manifestos_height = Site.manifesto_height * Site.manifestos_n,
        Site.manifesto_start = Site.manifestos_container.offset().top,
        Site.manifesto_end = Site.manifesto_start + Site.manifestos_height,
        Site.manifestos_container.height(Site.manifestos_height);
        var e = $(window).height(),
        t = $(window).scrollTop(),
        n = Site.header.outerHeight(),
        i = .5 * (e + n - Site.manifesto_height),
        o = .5 * (Site.manifesto_height - e + n),
        r = t - Site.manifesto_start + i;
        if (r >= 0 && r < Site.manifestos_height && $(window).width() > 768) {
            var a = Math.floor(r / Site.manifesto_height) + 1,
            s = "block";
            a >= Site.manifestos_n && (a = Site.manifestos_n - 1, s = "none"),
            Site.manifestos.each(function(t) {
                var n = $(this);
                t > a && n.css({
                    top: e,
                    position: "fixed",
                    "z-index": 10,
                    display: "block"
                }),
                a == t && n.css({
                    top: e - (r - Site.manifesto_height * (a - 1)) + o,
                    position: "fixed",
                    "z-index": 100,
                    display: "block"
                }),
                a > t && n.css({
                    top: i,
                    position: "fixed",
                    "z-index": 11 + t,
                    display: s
                })
            })
        } else Site.manifestos.css({
            top: 0,
            position: "relative",
            "z-index": 0,
            display: "block"
        })
    },

    直接疯掉了,估计一下子没几个人能看懂。那么就把他“翻译”一下。

    && (逻辑与)

    这里主要是一个“&&”运算,首先要搞懂这个,看一个简单的例子:

     
    1 var a = 1 && 2 && 3;//3
    2 var b = 0 && 1 && 2;//0
    3 var c = 1 && 0  && 2;//0
    4 alert(a),alert(b),alert(c);

    嘿嘿,写法很奇怪,运行的结果是3,0,0。一般我们在if语句中经常用到。“&&” (逻辑与) 运算和“||”运算真好相反,“&&” 运算遇到false就返回。
    例如: a && b ,如果 a 为true,直接返回b,而不管b为true或者false 。如果 a 为false 那么直接返回a,上面例子中第一个var a = 1 && 2 && 3;因为1 && 2,1为真,返回2;2&&3, 2为真,返回3 。

    ||(逻辑或)

    再来看看“||”(逻辑或)运算,看例子:

     
    1 var a = 0 || 1 || 2;//1
    2 var b = 1 || 0 || 3;//1
    3 alert(a),alert(b);

    “||”运算遇到true就返回。例如:a || b ,如果 a 为false,直接返回b,而不管b为true或者false ,如果为a || b ||c   a为false, b为true则 返回b , 如果b为false,  直接返回c,而不管c为true或者false  。如果 a 为true,直接返回a,而不会继续往下执行。

    && (逻辑与) 和||(逻辑或)混合使用的时候要注意他们的优先级:

    && (逻辑与) 优先级高于||(逻辑或)
    return a && b || c ,
    根据a来判断返回值,a 是 false 则肯定返回 c;如果 b , c 都是 true ,那么我们就可以根据 a 来决定b 还是 c ,如果 a 是 false 则返回 c,如果a是true 则返回 b。
    return a || b && c
    根据优先级相当于先算 b && c ,然后和a 相 或;如果a是true,则返回a,不论是b或c,如果a是false,则如果b是false,返回b,如果b是true,返回c;

     
    1 var a = 3  &&  0 || 2;  //2
    3 var b = 3 || 0  &&  2; // 3
    5 var c= 0 || 2 && 3; // 3
    6 alert(a),alert(b),alert(c);

    另附:JS运算符优先级(从高到低列出)

    运算符 描述
    . [] () 字段访问、数组下标、函数调用以及表达式分组
    ++ -- - ~ ! delete new typeof void 一元运算符、返回数据类型、对象创建、未定义值
    * / % 乘法、除法、取模
    + - + 加法、减法、字符串连接
    << >> >>> 移位
    < <= > >= instanceof 小于、小于等于、大于、大于等于、instanceof
    == != === !== 等于、不等于、严格相等、非严格相等
    & 按位与
    ^ 按位异或
    | 按位或
    && 逻辑与
    || 逻辑或
    ?: 条件
    = oP= 赋值、运算赋值
    , 多重求值
  • 相关阅读:
    [hdu6271]Master of Connected Component
    [hdu5468]Puzzled Elena
    [hdu4582]DFS spanning tree
    [poj2054]Color a Tree
    [luogu4107]兔子和樱花
    整除的尾数[HDU2099]
    胜利大逃亡[HDU1253]
    Bitset[HDU2051]
    折线分割平面[HDU2050]
    不容易系列之(4)——考新郎[HDU2049]
  • 原文地址:https://www.cnblogs.com/wicub/p/3568138.html
Copyright © 2011-2022 走看看