||和&&都是短路邏輯符。
他們的區(qū)別是:
- a && b
a和b同時為true 才返回 true冷冗, 否則返回false
- a || b
a或b任意一個為true 就返回true 扳肛, 否則返回false - &&的優(yōu)先級比||高
但是我們面試時可能會碰到的關(guān)于他們兩的很尷尬的題是意想不到的:
一正卧、先來說說||(邏輯或),從字面上來說碴倾,只有前后都是false的時候才返回false,否則返回true平窘。
alert("1"||"") //的輸出結(jié)果
//因為||左邊是"1",他是true.而||右邊是"",他是false.
但輸出結(jié)果是“1”
alert(true||false); // true
alert(false||true); // true
alert(true||true); // true
alert(false||false); // false
但是吓肋,從深層意義上來說的話,卻有另一番天地瑰艘,試這想一下下面的代碼:
alert(0||1);
顯然是鬼,我們知道,前面0意味著false,而后面1意味著true,那么上面的結(jié)果應(yīng)該是true,而事實返回的結(jié)果是1磅叛。再看下面代碼:
alert(2||1);
我們知道屑咳,前面2是true,后面1也是true,那返回結(jié)果又是什么呢?結(jié)果是2,繼續(xù)看:
alert('a'||1);
同樣,前面'a'是true弊琴,后面1也是true;測試結(jié)果是'a',下面
alert(''||1);
由上,我們知道前面''是false,后面1是true,而返回結(jié)果是1杖爽。
從上面的代碼可以總結(jié)出:
1敲董、只要“||”前面為false,不管“||”后面是true還是false紫皇,都返回“||”后面的值。
2腋寨、只要“||”前面為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);
結(jié)是返回'',“&&”前面''是false,后面是1是true。
alert(''&&0);
結(jié)是返回'',“&&”前面''是false,后面是0也是false佃延。
alert('a'&&1);
結(jié)是返回1,“&&”前面''a是true,后面是1也是true现诀。
alert(0&&'');
結(jié)是返回0,“&&”前面''0是false,后面是''也是false。
這意味著
1履肃、只要“&&”前面是false仔沿,無論“&&”后面是true還是false,結(jié)果都將返“&&”前面的值;
2尺棋、只要“&&”前面是true于未,無論“&&”后面是true還是false,結(jié)果都將返“&&”后面的值;
讓我們總結(jié)一下:
1陡鹃、只要“||”前面為false烘浦,無論“||”后面是true還是false,結(jié)果都返回“||”后面的值萍鲸。
2闷叉、只要“||”前面為true,無論“||”后面是true還是false脊阴,結(jié)果都返回“||”前面的值握侧。
3、只要“&&”前面是false嘿期,無論“&&”后面是true還是false品擎,結(jié)果都將返“&&”前面的值;
4、只要“&&”前面是true备徐,無論“&&”后面是true還是false萄传,結(jié)果都將返“&&”后面的值;
由上兩個測試可知,邏輯運算符蜜猾,“||”和“&&”都是遵行短路原則秀菱,只要確定符號前面的真假振诬,既可確定返回值。
需要說明的是“&&”的優(yōu)先級是高于“||”的衍菱,下面測試:
alert(1||'a'&&2);
返回結(jié)果是1赶么。
根據(jù)反證原理,我們假設(shè)“||”的優(yōu)先級不低于“&&”(這里只所以用“不低于”脊串,是為了同時證明等級相同的情況)辫呻。
根據(jù)上面我們得出的結(jié)論(1),(1||'a')將返回前面的值1琼锋,(1&&2)根據(jù)結(jié)論(4)應(yīng)該返回后面的值2放闺。這顯然不對,由此可知“&&”的優(yōu)先級是高于“||”的斩例。
希望可以幫到面試時一籌莫展的寶寶們~
fighting送給深夜加班奮斗的碼農(nóng)們