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