在其他語言中,我們往往看到邏輯符號出現在判斷語句當中,如
if(a||b){}
但在一些js相關的面試題或者書中,我們有時會看到邏輯與&&和邏輯或||符號出現在賦值語句或者返回語句中,如
var x=a||b; return a&&b||c;
第一次看到時,我們很可能一頭霧水,這是怎么回事?
因為在js中允許使用表達式賦值,所得的值為該表達式的運算結果。如
var a= 5; var b= 6; var c= a+b; a= 10; console.log(c);//11 js是按順序進行,之后的賦值不會影響之前已經計算后的表達式結果
var b= 6; var c= a+b; var a= 5; console.log(c);//NaN
//js雖然是按順序進行,但在js中變量聲明會提前處理,賦值操作只有在進行到該賦值語句時才會執行,所以執行到var c= a+b;時,a只定義未賦值。返回 not a num
我們知道,
邏輯與&&的運算規則:只有左右都是true時才為true,一邊是false時就是false。
邏輯或 | | 的運算規則:只有左右都是false時才為false,一個為true時就是true。
那么,在賦值語句和返回語句中邏輯與&&和邏輯或||又是怎樣呢?
賦予的和返回的值也不是判斷得到的布爾值,而是運算符左右兩旁某個表達式的運算結果。
對邏輯與&&來說:
當有一個false時,返回false一側的值;
當有兩個false時,返回運算符之前(左側)的值;
當有兩個true時,返回運算符之后(右側)的值。
邏輯與&&運算屬於短路運算,在按從左向右的運算順序運算時,如果一個為假,即停止運算,並返回為假的值。如,
var a={}; var b=56; //window.aaa為一個不存在的對象, console.log(window.aaa && null); //undefined console.log(null && window.aaa); //null console.log(a && null); //null console.log(window.aaa&& a); //undefined console.log(a && b); //56 console.log(b && a); //object {}
對邏輯或 | | 來說,正好同邏輯與&&相反:
當有一個true時,返回true一側的值;
當有兩個true時,返回運算符之前(左側)的值;
當有兩個false時,返回運算符之后(右側)的值。
邏輯或 | | 運算也屬於短路運算,在按從左向右的運算順序運算時,只有第一個操作數為假,才進行第二個操作數,返回停止運算一側的值,如
var a={}; var b=56; console.log(window.aaa || null); //null console.log(null || window.aaa); //window.aaa console.log(a || null); //object {} console.log(window.aaa|| a); //object {} console.log(a || b); //object {} console.log(b || a); //56
