java
&&與||的執行優先級是一樣的,不論有多少的混用都是從左到右執行
&&短路與,第一個爲false,整體爲false
||短路或,第一個爲true,整體爲true
public class Demo27 {
public static void main(String[] args) {
if (Demo27.aImFalseNo1() || Demo27.aImTrueNo1() && Demo27.aImTrueNo2() || Demo27.aImFalseNo2()){
System.out.println("main");
}
}
public static boolean aImFalseNo1(){
System.out.println("aImFalseNo1");
return false;
}
public static boolean aImFalseNo2(){
System.out.println("aImFalseNo2");
return false;
}
public static boolean aImTrueNo1(){
System.out.println("aImTrueNo1");
return true;
}
public static boolean aImTrueNo2(){
System.out.println("aImTrueNo2");
return true;
}
}
上面的demo程序,依次執行步驟詳解
第一次判斷:
Demo27.aImFalseNo1() 通過 || 與後面的 Demo27.aImTrueNo1() 鏈接
如果Demo27.aImFalseNo1()爲true,所有後面的都不同判斷,直接進入if語句
如果Demo27.aImFalseNo1()爲false,則繼續判斷
第二次判斷:
Demo27.aImTrueNo1() 通過 &&與後面的 Demo27.aImTrueNo2()鏈接
分兩種情況
第一種情況
如果Demo27.aImFalseNo1()爲false,後面的Demo27.aImTrueNo2()無需判斷,
因爲Demo27.aImTrueNo2() 通過|| 與Demo27.aImFalseNo2()鏈接,直接判斷Demo27.aImFalseNo2(),如果
Demo27.aImFalseNo2()爲true進入if語句,如果爲false,那麼整體的條件爲false
第二種情況
如果Demo27.aImFalseNo1()爲true,後面的Demo27.aImTrueNo2()需要繼續判斷,
如果Demo27.aImTrueNo2()爲true,則進入if語句,
如果Demo27.aImTrueNo2()爲false繼續判斷,
因爲Demo27.aImTrueNo2() 通過|| 與Demo27.aImFalseNo2()鏈接,直接判斷Demo27.aImFalseNo2(),如果
Demo27.aImFalseNo2()爲true進入if語句,如果爲false,那麼整體的條件爲false
end
因此上面的demo應該執行的是
Demo27.aImFalseNo1() 、Demo27.aImTrueNo1() 、Demo27.aImTrueNo2(),這三個方法,並會進入main方法
執行結果如下
備註:目前測試沒有發現加上小括號有什麼影響,應該是因爲都是短路的原因。
js
作爲if的判斷條件和java一樣,但是在js中有更多的用法
如下
const a = "a";
const b = "b";
const c = a || b;
const d = a && b;
console.log(c); //a
console.log(d); //b
執行結果解釋
1、const c = a || b;
當a有值,直接將a賦值給c,如果a沒有值,查看b,如果b有值,將b的值賦值給c
2、const d = a && b;
當a有值,將b的值賦值給d,當a沒有值,爲空,則將空賦值給b;
3、js的if條件中,必須要有值才爲true,如果沒有定義、或者沒有賦值、或者值爲空,都爲false
4、
//var obj = {userInfo:{person:{name:"zhangsan"}}};
var o = window.obj&&obj.userInfo&&obj.userInfo.person&&obj.userInfo.person.name;
if(o){
console.log(o);
}
上面的代碼,即使obj被註釋了也不會報錯,因爲時候通過window.obj來判斷的,所有的變量都是window的屬性