JavaScript雙問(wèn)號(hào)操作符(??)的驚人用法總結(jié)大全
前言
JavaScript作為一門(mén)不斷發(fā)展的語(yǔ)言,總是在引入新特性來(lái)解決開(kāi)發(fā)者的痛點(diǎn)。其中,ES2020引入的空值合并操作符(Nullish Coalescing Operator),即雙問(wèn)號(hào)操作符(??),是一個(gè)簡(jiǎn)單卻極其強(qiáng)大的工具,徹底改變了我們處理默認(rèn)值和空值的方式。
1. 基本概念:什么是??操作符
雙問(wèn)號(hào)操作符(??)是一個(gè)邏輯操作符,當(dāng)左側(cè)操作數(shù)為null或undefined時(shí),返回右側(cè)操作數(shù),否則返回左側(cè)操作數(shù)。這看似簡(jiǎn)單,但與我們常用的邏輯或操作符(||)有著本質(zhì)區(qū)別。
const value1 = null ?? 'default'; // 'default' const value2 = undefined ?? 'default'; // 'default' const value3 = false ?? 'default'; // false const value4 = 0 ?? 'default'; // 0 const value5 = '' ?? 'default'; // ''
2. ??與||的關(guān)鍵區(qū)別
在了解??操作符的強(qiáng)大之前,我們需要理解它與||操作符的區(qū)別:
// 使用|| const count = userCount || 10; // 當(dāng)userCount為0時(shí),count將為10 // 使用?? const count = userCount ?? 10; // 當(dāng)userCount為0時(shí),count將為0
||操作符會(huì)將所有"假值"(如0、''、false、NaN等)都視為需要使用默認(rèn)值的情況,而??操作符只在值為null或undefined時(shí)才使用默認(rèn)值。
3. 實(shí)際應(yīng)用
(1) 表單處理中的默認(rèn)值
function processForm(data) { // 只有當(dāng)值真正缺失時(shí)才使用默認(rèn)值 const username = data.username ?? 'guest'; const items = data.items ?? []; const quantity = data.quantity ?? 1; // 允許quantity為0 // 處理表單邏輯... }
(2) 配置對(duì)象的深層默認(rèn)值
const config = { server: { port: 0, // 有效值,但為"假值" host: '' // 有效值,但為"假值" } }; const userConfig = {}; // 正確處理深層配置 const port = userConfig?.server?.port ?? config.server.port; // 0 const host = userConfig?.server?.host ?? config.server.host; // ''
(3) API響應(yīng)處理
(4) 鏈?zhǔn)侥J(rèn)值
??操作符可以鏈?zhǔn)绞褂茫瑒?chuàng)建一個(gè)"默認(rèn)值瀑布":
(5) 與可選鏈操作符(?.)完美配合
當(dāng)與可選鏈操作符(?.)結(jié)合使用時(shí),處理復(fù)雜嵌套對(duì)象變得異常優(yōu)雅:
const userName = user?.profile?.preferences?.displayName ?? 'Guest';
這行代碼可以安全地深入訪問(wèn)一個(gè)可能不存在的嵌套屬性,并在任何一層為null或undefined時(shí)提供默認(rèn)值。
(6) 條件性執(zhí)行函數(shù)
// 僅當(dāng)handler存在時(shí)才執(zhí)行,否則使用默認(rèn)處理函數(shù) (customHandler ?? defaultHandler)(event);
(7) 數(shù)組元素的默認(rèn)值處理
4. 高級(jí)技巧
(1) 結(jié)合解構(gòu)賦值
const { name, age, title = 'Developer', company = 'Unknown' } = employee ?? {};
這個(gè)模式不僅能處理employee為null/undefined的情況,還為解構(gòu)出的個(gè)別屬性提供默認(rèn)值。
(2) 在類(lèi)中使用
class UserPreferences { constructor(settings) { this.theme = settings?.theme ?? 'light'; this.fontSize = settings?.fontSize ?? 16; this.notifications = settings?.notifications ?? true; // 即使settings.volume為0也會(huì)被保留 this.volume = settings?.volume ?? 0.5; } }
5. 性能考慮
??操作符不僅語(yǔ)法簡(jiǎn)潔,在某些情況下還能帶來(lái)性能優(yōu)勢(shì)。由于它只檢查null和undefined,比||操作符的類(lèi)型轉(zhuǎn)換操作更高效。
雙問(wèn)號(hào)操作符(??)雖然看似簡(jiǎn)單,卻解決了JavaScript中一個(gè)長(zhǎng)期存在的痛點(diǎn):如何正確處理"空值"與"假值"的區(qū)別。
總結(jié)
到此這篇關(guān)于JavaScript雙問(wèn)號(hào)操作符(??)驚人用法的文章就介紹到這了,更多相關(guān)JS 雙問(wèn)號(hào)操作符??用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript 讀取XML數(shù)據(jù),在頁(yè)面中展現(xiàn)、編輯、保存的實(shí)現(xiàn)
最近需要做這樣一個(gè)需求,數(shù)據(jù)保存在XML里,在頁(yè)面上通過(guò)表格顯示其內(nèi)容,可以修改內(nèi)容,再保存到XML。下面把做這個(gè)東西的過(guò)程記錄下來(lái),做個(gè)筆記,也給需要的人一些幫助。2009-10-10JS項(xiàng)目中對(duì)本地存儲(chǔ)進(jìn)行二次的封裝的實(shí)現(xiàn)
這篇文章主要介紹了JS項(xiàng)目中對(duì)本地存儲(chǔ)進(jìn)行二次的封裝,這里我們將要使用到的key存儲(chǔ)下來(lái),新建一個(gè)叫constant-storage.js的文件,對(duì)外暴露一些key的鍵名,也方便后期統(tǒng)一修改,這里因?yàn)槎际呛懔?,所以名稱我們都用大寫(xiě)表示,需要的朋友可以參考下2022-07-07javascript實(shí)現(xiàn)顏色漸變的方法
這篇文章介紹了javascript實(shí)現(xiàn)顏色漸變的方法,有需要的朋友可以參考一下2013-10-10微信小程序?qū)崿F(xiàn)瀑布流布局與無(wú)限加載的方法詳解
瀑布流布局是我們?nèi)粘i_(kāi)發(fā)中經(jīng)常見(jiàn)到的一種頁(yè)面布局方式,下面這篇文章主要給大家介紹了微信小程序?qū)崿F(xiàn)瀑布流布局與無(wú)限加載的相關(guān)資料,文中給出了詳細(xì)介紹和示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來(lái)一起看看吧。2017-05-05JavaScript中極易出錯(cuò)的操作符運(yùn)算總結(jié)
這篇文章主要給大家介紹了關(guān)于JavaScript中極易出錯(cuò)的操作符運(yùn)算的相關(guān)資料,包括了算術(shù)運(yùn)算符、比較運(yùn)算符、邏輯運(yùn)算符、賦值運(yùn)算符、一元運(yùn)算符以及運(yùn)算優(yōu)先級(jí)等問(wèn)題,需要的朋友可以參考下2021-08-08JS使用Date對(duì)象實(shí)時(shí)顯示當(dāng)前系統(tǒng)時(shí)間簡(jiǎn)單示例
這篇文章主要介紹了JS使用Date對(duì)象實(shí)時(shí)顯示當(dāng)前系統(tǒng)時(shí)間,涉及javascript基于定時(shí)器動(dòng)態(tài)操作Date對(duì)象相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-08-08純js實(shí)現(xiàn)瀑布流布局及ajax動(dòng)態(tài)新增數(shù)據(jù)
這篇文章主要介紹了基于javascript實(shí)現(xiàn)瀑布流布局,及ajax動(dòng)態(tài)新增數(shù)據(jù)的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04