有&符號(hào)。在es6中,“&&”是邏輯與運(yùn)算符,是一種AND布爾操作,語(yǔ)法為“操作數(shù)1 && 操作數(shù)2”;只有兩個(gè)操作數(shù)都為true時(shí),才返回true,否則返回false。邏輯與是一種短路邏輯,如果左側(cè)表達(dá)式為 false,則直接短路返回結(jié)果,不再運(yùn)算右側(cè)表達(dá)式。
前端(vue)入門(mén)到精通課程:進(jìn)入學(xué)習(xí)
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點(diǎn)擊使用
本教程操作環(huán)境:windows7系統(tǒng)、ECMAScript 6版、Dell G3電腦。
es6中有&符號(hào),“&&”是邏輯與運(yùn)算符。
邏輯與運(yùn)算&&
邏輯與運(yùn)算(&&)是 AND 布爾操作。只有兩個(gè)操作數(shù)都為 true 時(shí),才返回 true,否則返回 false。具體描述如表所示。
第一個(gè)操作數(shù) | 第二個(gè)操作數(shù) | 運(yùn)算結(jié)果 |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
邏輯與是一種短路邏輯,如果左側(cè)表達(dá)式為 false,則直接短路返回結(jié)果,不再運(yùn)算右側(cè)表達(dá)式。運(yùn)算邏輯如下:
-
第 1 步:計(jì)算第一個(gè)操作數(shù)(左側(cè)表達(dá)式)的值。
-
第 2 步:檢測(cè)第一個(gè)操作數(shù)的值。如果左側(cè)表達(dá)式的值可轉(zhuǎn)換為 false(如 null、undefined、NaN、0、""、false),那么就會(huì)結(jié)束運(yùn)算,直接返回第一個(gè)操作數(shù)的值。
-
第 3 步:如果第一個(gè)操作數(shù)可以轉(zhuǎn)換為 true,則計(jì)算第二個(gè)操作數(shù)(右側(cè)表達(dá)式)的值。
-
第 4 步:返回第二個(gè)操作數(shù)的值。
示例1
下面代碼利用邏輯與運(yùn)算檢測(cè)變量并進(jìn)行初始化。
var user; //定義變量 (! user && console.log("沒(méi)有賦值")); //返回提示信息“沒(méi)有賦值”
等效于:
var user; //定義變量 if (! user){ //條件判斷 console.log("變量沒(méi)有賦值"); }
如果變量 user 的值為 0 或空字符串等假值轉(zhuǎn)換為布爾值時(shí),則為 false,那么當(dāng)變量賦值之后,依然提示變量沒(méi)有賦值。因此,在設(shè)計(jì)時(shí)必須確保邏輯與左側(cè)的表達(dá)式返回值是一個(gè)可以預(yù)測(cè)的值。
var user = 0; //定義并初始化變量 (! user && console.log("變量沒(méi)有賦值")); //返回提示信息“變量沒(méi)有賦值”
右側(cè)表達(dá)式不應(yīng)該包含賦值、遞增、遞減和函數(shù)調(diào)用等有效運(yùn)算,因?yàn)楫?dāng)左側(cè)表達(dá)式為 false 時(shí),則直接跳過(guò)右側(cè)表達(dá)式,會(huì)給后面的運(yùn)算帶來(lái)潛在影響。
示例2
使用邏輯與運(yùn)算符可以代替設(shè)計(jì)多重分支結(jié)構(gòu)。
var n = 3; (n == 1) && console.log(1); (n == 2) && console.log(2); (n == 3) && console.log(3); ( ! n ) && console.log("null");
上面代碼等效于下面多重分支結(jié)構(gòu)。
var n = 3; switch(n){ case1: console.log(1); break; case2: console.log(2); break; case3: console.log(3); break; default: console.log("null");
邏輯與運(yùn)算的操作數(shù)可以是任意類(lèi)型的值,并返回原始表達(dá)式的值,而不是把操作數(shù)轉(zhuǎn)換為布爾值再返回。
1) 對(duì)象被轉(zhuǎn)換為布爾值時(shí)為 true。例如,一個(gè)空對(duì)象與一個(gè)布爾值進(jìn)行邏輯與運(yùn)算。
console.log(typeof ({} && true)); //返回第二個(gè)操作數(shù)的值 true的類(lèi)型:布爾型 console.log(typeof (true && {})); //返回第二個(gè)操作數(shù)的值 {}的類(lèi)型:對(duì)象
2) 如果操作數(shù)中包含 null,則返回值總是 null。例如,字符串 "null" 與 null 類(lèi)型值進(jìn)行邏輯與運(yùn)算,不管位置如何,始終都返回 null。
console.log(typeof ("null" && null)); //返回null的類(lèi)型:對(duì)象 console.log(typeof (null && "null")); //返回null的類(lèi)型:對(duì)象
3) 如果操作數(shù)中包含 NaN,則返回值總是 NaN。例如,字符串 "NaN" 與 NaN 類(lèi)型值進(jìn)行邏輯與運(yùn)算,不管位置如何,始終都返回 NaN。
console.log(typeof ("NaN" && NaN)); //返回NaN的類(lèi)型:數(shù)值 console.log(typeof (NaN && "NaN")); //返回NaN的類(lèi)型:數(shù)值
4) 對(duì)于 Infinity 來(lái)說(shuō),將被轉(zhuǎn)換為 true,與普通數(shù)值一樣參與邏輯與運(yùn)算。
console.log(typeof ("Infinity" && Infinity)); //返回第二個(gè)操作數(shù)Infinity的類(lèi)型:數(shù)值 console.log(typeof (Infinity && "Infinity")); //返回第二個(gè)操作數(shù)"Infinity"的類(lèi)型:字符串
5) 如果操作數(shù)中包含 undefined,則返回 undefined。例如,字符串 "undefined" 與 undefined 類(lèi)型值進(jìn)行邏輯與運(yùn)算,不管位置如何,始終都返回 undefined。
console.log(typeof ("undefined" && undefined)); //返回undefined console.log(typeof (undefined && "undefined")); //返回undefined
擴(kuò)展知識(shí):ES6中&&和 __ 鮮為人知的騷操作
眾所周知,在es6中,邏輯運(yùn)算符&&代表與條件,||代表或條件
let info = { name:"long", age:null }; //&& //info的name與age同時(shí)為真,則結(jié)果為真 if(info.name && info.age){ console.log("與條件"); //與條件 }else{ console.log("失敗"); } //|| //info的name或age,只要有一個(gè)為真,則結(jié)果為真 if(info.name || info.age){ console.log("或條件"); //或條件 }else{ console.log("失敗"); }
代替if/else
但是,他們還可以代表if/else進(jìn)行簡(jiǎn)化
let info = {name:"long"}; let name = info && info.name; //long let isVip = false; let vipPrice = isVip || 19;//19
decide() && true(); //如果decide()執(zhí)行后為true,則執(zhí)行true(),并輸出true()的值;如果decide()執(zhí)行后為false,則輸出decide()執(zhí)行后的結(jié)果,且不執(zhí)行true() //預(yù)計(jì)使用場(chǎng)景,有一個(gè)mongo查詢(xún)條件where,當(dāng)name存在時(shí),匹配name數(shù)據(jù) where= {age:19}; name && where.name = name;
decide() || false(); //如果decide()執(zhí)行后為true,則執(zhí)行decide(),并輸出decide()的值,fasle()不執(zhí)行;如果decide()執(zhí)行后為false,則執(zhí)行fasle(),且輸出false()的結(jié)果
decide() && true() || fasle(); //如果decide()執(zhí)行后為true,則執(zhí)行true(),并輸出true()的值; //如果decide()執(zhí)行后為false,則執(zhí)行false(),并輸出false()的值
【