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 逗號 從左到右 … , …


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM