Javascript邏輯運算符“||”和“&&”
前面一直沒空,遺留了幾個問題,現(xiàn)在處理下。
在javascript中運算符 & 的作用。
- // 9 is 00000000000000000000000000001001
- var expr1 = 9;
- // 5 is 00000000000000000000000000000101
- var expr2 = 5;
- // 1 is 00000000000000000000000000000001
- var result = expr1 & expr2;
- document.write(result);
- // Output: 1
在這里先是將9 和5轉換為2進制,然后在進行運算,然后根據(jù)每一位對應來計算,兩種均為1為1的計算放法,也就是‘與’。
一、先來說說||(邏輯或),從字面上來說,只有前后都是false的時候才返回false,否則返回true。
- alert(true||false); // true
- alert(false||true); // true
- alert(true||true); // true
- alert(false||false); // false
但是,從深層意義上來說的話,卻有另一番天地,試下面代碼:
- alert(0||1);
顯然,我們知道,前面0意味著false,而后面1意味著true,那么上面的結果應該是true,而事實返回的結果是1。再看下面代碼:
- alert(2||1);
我們知道,前面2是true,后面1也是true,那返回結果又是什么呢?測試結果是2,繼續(xù)看:
- alert('a'||1);
同樣,前面'a'是true,后面1也是true;測試結果是'a',下面
- alert(''||1);
由上,我們知道前面''是false,后面1是true,而返回結果是1。再看下面
- alert('a'||0);
前面'a'是true,而后面0是false,返回結果是'a',繼續(xù)下面
- alert('a'||'b');
前面'a'是true,后面'b'是false,返回結果是'a',我們繼續(xù)下面
- alert(''||0);
前面''是false,后面0同樣是false,返回結果是0
- alert(0||'');
前面0是false,后面''是false,返回結果是''
這就意味
- 只要“||”前面為false,不管“||”后面是true還是false,都返回“||”后面的值。
- 只要“||”前面為true,不管“||”后面是true還是false,都返回“||”前面的值。
二、下面說說&&(邏輯與),從字面上來說,只有前后都是true的時候才返回true,否則返回false。
- alert(true&&false); // false
- alert(true&&true); // true
- alert(false&&false); // false
- alert(false&&true); // false
然后,根據(jù)上面經(jīng)驗,我們看看“&&”號前后,不單單是布爾類型的情況。
- alert(''&&1);
結是返回'',“&&”前面''是false,后面是1是true。
- alert(''&&0);
結是返回'',“&&”前面''是false,后面是0也是false。
- alert('a'&&1);
結是返回1,“&&”前面''a是true,后面是1也是true。
- alert('a'&&0);
結是返回0,“&&”前面''a是true,后面是0是false。
- alert('a'&&'');
結是返回'',“&&”前面''a是true,后面是''是false。
- alert(0&&'a');
結是返回0,“&&”前面''0是false,后面是'a'是true。
- alert(0&&'');
結是返回0,“&&”前面''0是false,后面是''也是false。
這意味著
- 只要“&&”前面是false,無論“&&”后面是true還是false,結果都將返“&&”前面的值;
- 只要“&&”前面是true,無論“&&”后面是true還是false,結果都將返“&&”后面的值;
讓我們總結一下:
1. 只要“||”前面為false,無論“||”后面是true還是false,結果都返回“||”后面的值。
2. 只要“||”前面為true,無論“||”后面是true還是false,結果都返回“||”前面的值。
3. 只要“&&”前面是false,無論“&&”后面是true還是false,結果都將返“&&”前面的值;
4. 只要“&&”前面是true,無論“&&”后面是true還是false,結果都將返“&&”后面的值;
由上兩個測試可知,邏輯運算符,“||”和“&&”都是遵行短路原則,只要確定符號前面的真假,既可確定返回值。
需要說明的是“&&”的優(yōu)先級是高于“||”的,下面測試:
- alert(1||'a'&&2);
返回結果是1。
根據(jù)反證原理,我們假設“||”的優(yōu)先級不低于“&&”(這里只所以用“不低于”,是為了同時證明等級相同的情況)。
根據(jù)上面我們得出的結論(1),(1||'a')將返回前面的值1,(1&&2)根據(jù)結論(4)應該返回后面的值2。這顯然不對,由此可知“&&”的優(yōu)先級是高于“||”的。
【本文為51CTO專欄作者“謝軍”的原創(chuàng)稿件,轉載可通過作者微信公眾號(jingfeng18)獲取聯(lián)系】