本文目錄:
- 1.前置知識(shí):虛值
- 2.??操作符
- 3.??= 操作符
- 4.?.操作符
- 5.?操作符
1.前置知識(shí):虛值
falsy值(虛值)是在Boolean上下文中被認(rèn)定為false的值。
JavaScript在需要用到布爾類型值的上下文中使用強(qiáng)制類型轉(zhuǎn)換將值轉(zhuǎn)換為布爾值正勒,例如條件語句和循環(huán)語句崭捍。
在 JavaScript 中只有 8 個(gè) falsy 值呜师。
這意味著當(dāng) JavaScript 期望一個(gè)布爾值饲梭,并被給與下面值中的一個(gè)時(shí),它總是會(huì)被當(dāng)做 false
序號(hào) | 值 |
---|---|
1 | false |
2 | 0 |
3 | -0 |
4 | “” ‘’ `` |
5 | 0n |
6 | null |
7 | undefined |
8 | NaN |
另外再介紹一個(gè)概念Nullish鹉戚,Nullish就是一個(gè)要么是null挑格,要么是undefined的值
2.??操作符
在 JavaScript 中,?? 操作符被稱為nullish 合并操作符孵滞。如果第一個(gè)參數(shù)不是 null/undefined中捆,這個(gè)運(yùn)算符將返回第一個(gè)參數(shù),否則坊饶,它將返回第二個(gè)參數(shù)泄伪。讓我們看一個(gè)例子。
null ?? 5 // => 5
3 ?? 5 // => 3
看上去??和||的功能一樣匿级,但是??會(huì)忽略除了null和undefined的其他falsy值蟋滴,下面這個(gè)例子可以看出區(qū)別:
var abc = 0||'123'
console.log(abc) //‘123’
var abc2 = 0??'123'
console.log(abc2) //0
在更嚴(yán)格的開發(fā)過程中,??可以有效防止一些falsy值的丟失痘绎。
3.??= 操作符
??= 又稱為邏輯 nullish 賦值操作符
只有當(dāng)前值為 null 或 undefined 時(shí)津函,此賦值運(yùn)算符才會(huì)分配新值。
var x = null
var y = 5
console.log(x ??= y) // => 5
console.log(x = (x ?? y)) // => 5
接下來孤页,讓我們看看這個(gè)操作符與默認(rèn)參數(shù)的區(qū)別球散。
function gameParamsWithNullish(options) {
options.game ??= 1
options.football ??= 'easy'
return options
}
function gameParamsWithDefaultParams(game=1, football='easy') {
return {game, football}
}
console.log(gameParamsWithNullish({game: null, football: null})) // => { game: 1, football: 'easy' }
console.log(gameParamsWithDefaultParams(null, null)) // => { game: null, football: null }
如果使用的是默認(rèn)參數(shù),會(huì)被null覆蓋掉散庶,而??=可以避免這種情況的發(fā)生
4.?.操作符
可選的鏈接操作符 ?. 允許開發(fā)人員讀取深度嵌套在一個(gè)對(duì)象鏈中的屬性值蕉堰,而不必沿途顯式驗(yàn)證每個(gè)引用。當(dāng)引用為 null 時(shí)悲龟,表達(dá)式停止計(jì)算并返回 undefined屋讶。
來看下面的例子,定義一個(gè)對(duì)象abc须教,我們事先并不知道這個(gè)對(duì)象里面的數(shù)據(jù)結(jié)構(gòu)和內(nèi)容皿渗,讓我們先用傳統(tǒng)的方法來去里面嵌套的level1~level4斩芭,為了不讓程序報(bào)錯(cuò),需要寫下面的代碼進(jìn)行層層驗(yàn)證
var abc = {}
console.log(abc.level1?.level2?.level3?.level4)
if(abc.level1){
if(abc.level1.level2){
if(abc.level1.level2.level3){
console.log(abc.level1.level2.level3.level4)
}
}
}
而使用?.乐疆,一行代碼就可以搞定
console.log(abc.level1?.level2?.level3?.level4)
5.?操作符
這應(yīng)該是對(duì)于大多數(shù)人來說最熟悉的帶有?的操作符
三元運(yùn)算符 ? 有三個(gè)操作數(shù): 一個(gè)條件划乖,一個(gè)條件為真時(shí)執(zhí)行的表達(dá)式,以及一個(gè)條件為假時(shí)執(zhí)行的表達(dá)式挤土。
function checkCharge(charge) {
return (charge > 0) ? 'Ready for use' : 'Needs to charge'
}
console.log(checkCharge(20)) // => 'Ready for use'
console.log(checkCharge(0)) // => 'Needs to charge'