zoukankan      html  css  js  c++  java
  • js 运算符优先级

    在看jquery源码,仔细看入口函数的时候,有点懵了。看到与或、多重三目,傻傻的分不清,就代码仔细的区分下运算符优先级,以前都是呼呼的飘过。看来任何一个细节都不能忽略,不然效率极低。。

    !function(a, b) {
        "object" == typeof module && "object" == typeof module.exports ? module.exports = a.document ? b(a, !0) : function(a) {
            if (!a.document)
                throw new Error("jQuery requires a window with a document");
            return b(a)
        }
        : b(a)
    }("undefined" != typeof window ? window : this, function(a, b) {
      //代码
         n = function(a, b) {
            return new n.fn.init(a,b)
         };
         A = n.fn.init = function(a,b){ //代码};
         A.prototypt = n.fn;
        
        return n
    })();
    

    由于优先级 == 高于 && 、|| 高于 ?: 高于 =, 所以里面的函数体 相当于

    `(` object" == typeof module && "object" == typeof module.exports `)`    `?`  module.exports  = 
    `(`     a.document ?   b(a, !0)   :   function(a) {if (!a.document) throw new Error("jQuery requires a window with a document");  return b(a)}    `)` 
    `:`  b(a)
    
    • 赋值是从右到左赋值。

    场景一

    function foo() { var a = b = 0;}//会产生全局变量
    

    首先,是赋值表达式b = 0,此情况下b是未声明的。这个表达式的返回值是0,然后这个0就分配给了通过var定义的这个局部变量a。
    场景二
    看到代码在判断的时候经常看到如下形式:

    if('string' == a)
    
    为什么string放在左边而不是放在右边呢?看到 赋值的循序菜知道string位于左值的优势,如果变量a不存在,就不用接下来的判断了,这是良好的编程习惯呀。
    
    • 逗号表达式 ==>从左到右的顺序被执行,并获得右边表达式的值

    example:

    a =(7,9,0); // a=0
    
    • && 优先级高于 || , 所以碰到与或运算最好是写上括号(ps:/developer.mozilla.org上写着||高于&&,本人试过了,这个是错的)

    var a = true, b = false, c = false;
    console.log( a || b && c )  // true
    console.log( (a || b) && c ) // false
    console.log( a || (b && c) )  // true
    
    • 下面是一个关于new () . 优先的题,不看下面的表格后面两题简直是做不出来

    function Foo() {
        getName = function () { console (1); };
        return this;
    }
    Foo.getName = function () { console (2);};
    
    Foo.prototype.getName = function () { console (3);};
    
    var getName = function () { console (4);};
    
    function getName() { console (5);}
    
    //请写出以下输出结果:
    Foo.getName();
    getName();
    Foo().getName();
    getName();
    
    new Foo.getName();
    new Foo().getName();
    new new Foo().getName();
    

    /*
    *2
    *4

    • 1
      *1
      *2
      *3
      *3
      */

    js运算符 参考来源:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

    具体的js运算符如下:

    优先级 运算类型 关联性 运算符
    19 圆括号 n/a ( … )
    18 成员访问 从左到右 … . …
    需计算的成员访问 从左到右 … [ … ]
    new (带参数列表) n/a new … ( … )
    17 函数调用 从左到右 … ( … )
    new (无参数列表) 从右到左 new …
    16 后置递增(运算符在后) n/a … ++
    后置递减(运算符在后) n/a … --
    15 逻辑非 从右到左 ! …
    按位非 从右到左 ~ …
    一元加法 从右到左 + …
    一元减法 从右到左 - …
    前置递增 从右到左 ++ …
    前置递减 从右到左 -- …
    typeof 从右到左 typeof …
    void 从右到左 void …
    delete 从右到左 delete …
    14 乘法 从左到右 … * …
    除法 从左到右 … / …
    取模 从左到右 … % …
    13 加法 从左到右 … + …
    减法 从左到右 … - …
    12 按位左移 从左到右 … << …
    按位右移 从左到右 … >> …
    无符号右移 从左到右 … >>> …
    11 小于 从左到右 … < …
    小于等于 从左到右 … <= …
    大于 从左到右 … > …
    大于等于 从左到右 … >= …
    in 从左到右 … in …
    instanceof 从左到右 … instanceof …
    10 等号 从左到右 … == …
    非等号 从左到右 … != …
    全等号 从左到右 … === …
    非全等号 从左到右 … !== …
    9 按位与 从左到右 … & …
    8 按位异或 从左到右 … ^ …
    7 按位或 从左到右 … | …
    6 逻辑与 从左到右 … && …
    5 逻辑或 从左到右 … || …
    4 条件运算符 从右到左 … ? … : …
    3 赋值 从右到左 … = …
    … += …
    … -= …
    … *= …
    … /= …
    … %= …
    … <<= …
    … >>= …
    … >>>= …
    … &= …
    … ^= …
    … |= …
    2 yield 从右到左 yield …
    yield* 从右到左 yield* …
    1 Spread n/a ... …
    0 逗号 从左到右 … , …
  • 相关阅读:
    poj 3310(并查集判环,图的连通性,树上最长直径路径标记)
    poj 3308(最小点权覆盖、最小割)
    poj 3281(网络流+拆点)
    poj 3275(传递闭包)
    poj 3204(最小割)
    poj 3164(最小树形图)
    poj 2987(最大权闭合图+割边最少)
    poj 2455(二分+最大流)
    poj 2391(二分+最大流)
    poj 2135(最小费用最大流)
  • 原文地址:https://www.cnblogs.com/lyre/p/5475169.html
Copyright © 2011-2022 走看看