在看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 逗号 从左到右 … , …
posted on 2016-05-09 19:38  lyrezz  阅读(2821)  评论(0编辑  收藏  举报