今天看了一段YUI compressor壓縮的js代碼:
userNum && (ind += index,ind >= userNum && (ind -= userNum),ind < 0 && (ind === -2 && (ind = -1),ind += userNum),selLi.removeClass("on"),$(selLi[ind]).addClass("on"));
直接瘋掉了,估計一下子沒幾個人能看懂。那麼就把他“翻譯”一下。
&& (邏輯與)
這裡主要是一個“&&”運算,首先要搞懂這個,看一個簡單的例子:
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 。
搞懂了“&&” 運算,再來看最上的面的YUI compressor壓縮的js代碼,翻譯一下:
if(userNum){ind+=index;if(ind>=userNum){ ind-=userNum;} if(ind < 0){if(ind === -2){ind = -1;} ind += userNum;}selLi.removeClass("on");$(selLi[ind]).addClass("on"); }說來慚愧,年紀大了,足足“翻譯”了半個小時,還是在同事的幫助下才“翻譯”正確。
||(邏輯或)
再來看看“||”(邏輯或)運算,看例子:
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 為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= | 賦值、運算賦值 |
| , | 多重求值 |
以上這篇淺談JS運算符&&和|| 及其優先級就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。