"" , false , 0 , null , undefined , NaN 當(dāng)條件為這些值的時(shí)候返回 false
位運(yùn)算 ! !!
! 的用法是比較靈活的,它除了做邏輯運(yùn)算常常會(huì)用!做類型判斷,可以用!與上對(duì)象來求得一個(gè)布爾值,!可將變量轉(zhuǎn)換成boolean類型,0,null、undefined和空字符串取反都為true,其余都為false。
!false // true
位運(yùn)算符:& 和 |
& 運(yùn)算方法:同 1 則 1 | 運(yùn)算方法:同 0 則 0
33 & 2 // 結(jié)果為 0
33 | 2 // 結(jié)果為 35
100000
000010
// 理由:33的二進(jìn)制為100000,2的二進(jìn)制為10
// 100000
// 000010
// | 同0為0 100010 & 同1為1 000000
“!!” ——兩個(gè)嘆號(hào)表示把目標(biāo)值轉(zhuǎn)化為布爾值,相當(dāng)于使用Boolean()方法
邏輯運(yùn)算符:&& 和 ||
進(jìn)行布爾值的且和或的運(yùn)算。當(dāng)運(yùn)算到某一個(gè)變量就得出最終結(jié)果之后,就返回哪個(gè)變量。
a || b:如果a是true,那么b不管是true還是false,都返回true。因此不用判斷b了,這個(gè)時(shí)候剛好判斷到a,因此返回a。
如果a是false,那么就要判斷b,如果b是true,那么返回true,如果b是false,返回false,其實(shí)不就是返回b了嗎。
a && b:如果a是false,那么b不管是true還是false,都返回false,因此不用判斷b了,這個(gè)時(shí)候剛好判斷到a,因此返回a。
如果a是true,那么就要在判斷b,和剛剛一樣,不管b是true是false,都返回b。
alert(0 || 10) // 10
alert(0 && 10) // 0
let test=1;
console.log(true && test++ || true) // 1
console.log(test) // 2
// true && test++ 等價(jià)于
if (true ) {
test++
}
-
&&優(yōu)先于||運(yùn)算 -
||和&&都是遵行短路原則,只要確定符號(hào)前面的真假,既可確定返回值。
ES6 運(yùn)算符
?? 非空運(yùn)算符
?? 運(yùn)算符 如果第一個(gè)參數(shù)不是 null/undefined,將返回第一個(gè)參數(shù),否則返回第二個(gè)參數(shù)。
0 ?? 5 // 0
NaN ?? 5 // NaN
"" ?? 5 // ""
false ?? 5 // false
null ?? 5 // 5
undefined ?? 5 // 5
?. 鏈判斷運(yùn)算符
?. 允許開發(fā)人員讀取深度嵌套在對(duì)象鏈中的屬性值,而不必驗(yàn)證每個(gè)引用。當(dāng)引用為空時(shí),表達(dá)式停止計(jì)算并返回 undefined。
let travelPlans = {
destination: 'DC',
monday: {
location: 'National Mall',
budget: 200,
host: null
}
}
let res = travelPlans?.tuesday?.location ?? "locahost"; // => locahost
// 等價(jià)于 if(travelPlans && travelPlans.tuesday && travelPlans.tuesday.location){travelPlans.tuesday.location}else{"locahost"}
let res2 = travelPlans?.host; // => undefined