JavaScript雙問號操作符(??)詳解,解決使用 || 時因類型轉換帶來的問題

目錄

JavaScript雙問號操作符(??)詳解,解決使用||時因類型轉換帶來的問題

一、雙問號操作符??的基礎用法

1、傳統方式的痛點

2、雙問號操作符??的精確判斷

3、雙問號操作符??與邏輯或操作符||的對比

二、復雜場景下的空值處理

1、深層嵌套對象的默認值

2、函數參數的默認值陷阱

3、多條件回退策略

三、實戰案例解析

1、Vue組件中的Prop處理

2、表單驗證

四、雙問號操作符的性能優勢

五、結語


????????作者:watermelo37

? ? ? ? CSDN萬粉博主、華為云云享專家、阿里云專家博主、騰訊云、支付寶合作作者,全平臺博客昵稱watermelo37。

? ? ? ? 一個假裝是giser的coder,做不只專注于業務邏輯的前端工程師,Java、Docker、Python、LLM均有涉獵。

---------------------------------------------------------------------

溫柔地對待溫柔的人,包容的三觀就是最大的溫柔。

---------------------------------------------------------------------

JavaScript雙問號操作符(??)詳解,解決使用||時因類型轉換帶來的問題

????????在現代JavaScript開發中,處理變量默認值是一個常見但容易引發bug的操作。很多開發者可能都遇到過這樣的問題:使用||設置默認值時,意外覆蓋了0、''等合法值。這時候,ES2020引入的雙問號操作符(??)就能完美解決這類問題。本文將帶您全面掌握這個操作符的使用場景和高級技巧。

一、雙問號操作符??的基礎用法

1、傳統方式的痛點

const count = 0;
const result = count || 10; // 得到10,但0可能是有效值

????????使用||時,會把所有假值 (falsy values)視為無效值,包括:0、''、false、NaN、null、undefined。這在處理數字表單、開關狀態等場景時會引發問題。

? ? ? ? 以上述案例來說,我想要count被賦值的情況下就使用count的值,要是沒有被賦值就使用默認值10,但是當count被初始化并賦值為0的時候,邏輯或操作符||依然會認為是無效值,并將result賦值為10,這顯然和我預期的結果相悖。這是因為JavaScript是一門弱類型語言,會進行強制類型轉換。

2、雙問號操作符??的精確判斷

? ? ? ? 同樣還是這個例子:

const count = 0;
const result = count ?? 10; // 得到0,完美保留有效值

????????此時result的結果就是10,因為??操作符只對null和undefined這兩個原始值進行判斷,其他假值都會被保留。這種特性使其特別適合處理以下場景:

  • 表單輸入值(允許0或空字符串)
  • 布爾類型配置項
  • 數字類型參數(允許0)

3、雙問號操作符??與邏輯或操作符||的對比

特性?? 操作符?|| 操作符
觸發條件

僅?null/undefined

所有假值
適用場景精準空值判斷快速默認值設置
處理 0 和 ''保留有效值覆蓋為默認值
處理 false保留布爾值覆蓋為默認值

二、復雜場景下的空值處理

1、深層嵌套對象的默認值

????????結合可選鏈操作符(?.),可以安全地處理多層嵌套對象的屬性訪問。

const config = {api: {v1: {endpoint: ''}}
};// 傳統寫法(需要逐層判斷)
const endpoint = config.api?.v1?.endpoint || 'default';// 使用??的改進寫法
const endpoint = config.api?.v1?.endpoint ?? 'default';

2、函數參數的默認值陷阱

????????當函數參數需要接收布爾值時,使用??可以避免意外覆蓋用戶傳入的false值。

function createPost(data) {// 錯誤寫法:會覆蓋有效布爾值const isPublic = data.isPublic || true;// 正確寫法:僅處理null/undefinedconst isPublic = data.isPublic ?? true;
}

3、多條件回退策略

????????通過鏈式使用??,可以實現多層級的配置回退機制,這種模式在讀取環境變量時特別實用。

const theme = userConfig.theme ?? systemConfig.theme ?? process.env.THEME ?? 'light';

三、實戰案例解析

1、Vue組件中的Prop處理

? ? ? ? 如果disabled接收的值為false,如果使用邏輯或操作符,就會被認為是無效值,從而使用默認的true值。如果使用雙問號操作符就可以避免這種情況。

<template><input :disabled="isDisabled" />
</template><script>
export default {props: {disabled: {type: Boolean,default: undefined}},computed: {isDisabled() {return this.disabled ?? true;}}
}
</script>

2、表單驗證

? ? ? ? 就算你不允許用戶輸入空格,起碼要允許用戶輸入0和引號吧?如果使用邏輯或操作符,根本無法通過表單驗證,使用雙問號操作符就可以避免這種情況。

function validateForm(formData) {const errors = [];if (formData.username?.trim() ?? false) {errors.push('用戶名不能為空');}if (formData.age ?? false) {errors.push('年齡必須填寫');}return errors;
}

四、雙問號操作符的性能優勢

????????實際測試顯示,??在性能上與||基本持平,但在處理復雜對象時更具優勢。這是因為雙問號操作符只檢查null和undefined,比||操作符的類型轉換操作更高效。

? ? ? ? 當然,這部分差異很小,更多的作用是展示開發者的思維能力。

// 測試環境:Chrome 112,100萬次運算
console.time('||');
for (let i = 0; i < 1000000; i++) null || 10;
console.timeEnd('||'); // 2.1msconsole.time('??');
for (let i = 0; i < 1000000; i++) null ?? 10;
console.timeEnd('??'); // 1.8ms

五、結語

????????雙問號操作符(??)這個看似簡單的語法糖,實則蘊含著提升代碼健壯性的強大能力。在實際項目中,建議結合TypeScript的嚴格空值檢查,構建更可靠的類型安全體系。

????????只有鍛煉思維才能可持續地解決問題,只有思維才是真正值得學習和分享的核心要素。如果這篇博客能給您帶來一點幫助,麻煩您點個贊支持一下,還可以收藏起來以備不時之需,有疑問和錯誤歡迎在評論區指出~

????????其他熱門文章,請關注:

? ? ? ??極致的靈活度滿足工程美學:用Vue Flow繪制一個完美流程圖

???? ? ?你真的會使用Vue3的onMounted鉤子函數嗎?Vue3中onMounted的用法詳解

????????DeepSeek:全棧開發者視角下的AI革命者

??? ? ??通過array.filter()實現數組的數據篩選、數據清洗和鏈式調用

??? ? ??通過Array.sort() 實現多字段排序、排序穩定性、隨機排序洗牌算法、優化排序性能

??? ? ??TreeSize:免費的磁盤清理與管理神器,解決C盤爆滿的燃眉之急

??? ? ??通過MongoDB Atlas 實現語義搜索與 RAG——邁向AI的搜索機制

???? ? ?深入理解 JavaScript 中的 Array.find() 方法:原理、性能優勢與實用案例詳解

???? ? ?el-table實現動態數據的實時排序,一篇文章講清楚elementui的表格排序功能

??? ? ??MutationObserver詳解+案例——深入理解 JavaScript 中的 MutationObserver

????????JavaScript中通過array.map()實現數據轉換、創建派生數組、異步數據流處理、DOM操作等

????????高效工作流:用Mermaid繪制你的專屬流程圖;如何在Vue3中導入mermaid繪制流程圖

??? ? ??Dockerfile全面指南:從基礎到進階,掌握容器化構建的核心工具

????????在線編程實現!如何在Java后端通過DockerClient操作Docker生成python環境

??? ? ??干貨含源碼!如何用Java后端操作Docker(命令行篇)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905348.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905348.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905348.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智能體的典型應用:自動駕駛、智能客服、智能制造、游戲AI與數字人技術

本文為《React Agent&#xff1a;從零開始構建 AI 智能體》專欄系列文章。 專欄地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。項目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代碼示?例與實戰源&#xff09;。完整介紹…

Ubuntu 22.04(WSL2)使用Docker安裝Redis

Ubuntu 22.04&#xff08;WSL2&#xff09;使用Docker安裝Redis 本教程將指導您在運行于WSL2的Ubuntu 22.04上通過Docker安裝Redis 7.4.3。您將獲得一個配置了自定義設置、持久化存儲和安全選項的Redis實例。 前提條件 WSL2上已安裝Ubuntu 22.04。WSL2上已安裝并運行Docker&…

淺談 Redis 數據類型

淺談 Redis 數據類型 &#xff08;一&#xff09;String 類型 Redis 的 String 類型 是二進制安全的&#xff0c;可以用來存儲 文本字符串、int 類型數據和 bitmap 位圖 等數據。 1. 字符串操作 適用于存儲 文本、JSON、序列化數據 等任意二進制安全的內容 命令作用示例SET設…

Day1 時間復雜度

一 概念 在 C 中&#xff0c;時間復雜度是衡量算法運行時間隨輸入規模增長的趨勢的關鍵指標&#xff0c;用于評估算法的效率。它通過 大 O 表示法&#xff08;Big O Notation&#xff09; 描述&#xff0c;關注的是輸入規模 n 趨近于無窮大時&#xff0c;算法時間增長的主導因…

PAC文件:智能代理配置的瑞士軍刀

在日常上網和企業網絡環境中&#xff0c;我們經常需要配置代理服務器來訪問特定資源、增強安全性或管理網絡流量。Windows和macOS系統自帶的代理配置通常提供全局代理或簡單的排除列表&#xff0c;這在某些復雜場景下顯得不夠靈活。例如&#xff0c;我們可能只想代理某個特定的…

獲取高德地圖JS API的安全密鑰和Key的方法

要使用高德地圖JavaScript API&#xff0c;您需要獲取API Key和安全密鑰(securityJsCode)。以下是獲取步驟&#xff1a; 1. 注冊高德開放平臺賬號 首先訪問高德開放平臺&#xff0c;如果沒有賬號需要先注冊。 2. 創建應用獲取Key 登錄后進入"控制臺" 點擊"應…

攜程酒店 phantom-token token1004 分析

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 部分python代碼 搞APP搞的心態有點崩…

小紅書多賬號運營效率優化:技術方案與自動化實踐

目錄 一、效率瓶頸與流程優化方向 二、技術實現方案與效率提升路徑 1. 多賬號統一管理&#xff1a;環境隔離與批量操作 2. 自動化任務設計&#xff1a;RPA與腳本化執行 四、效果驗證與數據對比 五、總結與開源工具推薦 六、下載地址&#xff1a; 一、效率瓶頸與流程優化…

FastDDS Transport功能模塊初步整理

一. 總體結構 二. 主要類的功能 2.1 TransportDescriptor和TransportInterface ? FastDDS中整個Transport類的設計遵循的是設計模式中的建造者模式&#xff0c;其中&#xff0c;TransportDescriptor就是建造者&#xff0c;而TransportInterface則是建造出來的產品。 ? Tra…

zabbix最新版本7.2超級詳細安裝部署(一)

如果文章對你有用&#xff0c;請留下痕跡在配置過程中有問題請及時留言&#xff0c;本作者可以及時更新文章 目錄 1、提前準備環境 2、zabbix7.2安裝部署 3、安裝并配置數據庫 4、為Zabbix server配置數據庫 5、為Zabbix前端配置PHP 6、啟動Zabbix server和agent進程 7、關閉防…

CodeBlocks調試報錯

嘗試打斷點&#xff0c;并且點擊紅色箭頭啟動debugger時&#xff0c;控制臺報錯 Active debugger config: GDB/CDB debugger:Default Building to ensure sources are up-to-date Selecting target: Debug Adding source dir: C:\Users\Lenovo\Desktop\exercise\ Adding source…

Manus 開放注冊:AI 智能體領域的新起點

2025 年 5 月 13 日成為了一個具有特殊意義的日子 —— 備受矚目的 AI 智能體平臺 Manus&#xff08;Manus&#xff09;正式宣布開放注冊。這一消息猶如一顆重磅炸彈&#xff0c;瞬間在全球科技圈引起了廣泛關注和熱烈討論。在此之前&#xff0c;Manus 一直以其獨特的魅力和極高…

車載網關作為車輛網絡系統的核心樞紐

我是穿拖鞋的漢子&#xff0c;魔都中堅持長期主義的汽車電子工程師。 老規矩&#xff0c;分享一段喜歡的文字&#xff0c;避免自己成為高知識低文化的工程師&#xff1a; 鈍感力的“鈍”&#xff0c;不是木訥、遲鈍&#xff0c;而是直面困境的韌勁和耐力&#xff0c;是面對外界…

俄羅斯方塊算法2025.5.10

問題描述 俄羅斯方塊&#xff08;Tetris&#xff09;作為風靡全球38年的現象級益智游戲&#xff0c;其簡單易學但難于精通的特性使其成為游戲史上的不朽經典。以下是其核心游戲規則解析及我們的要求&#xff1a; 游戲界面由20行10列的可視區域組成&#xff0c;7種不同形狀的四…

Femap許可網絡配置

電磁仿真領域&#xff0c;Femap以其卓越的性能和廣泛的應用場景&#xff0c;成為眾多工程師和科研人員的首選工具。為了滿足多用戶協作的需求&#xff0c;Femap提供了靈活的網絡配置方案。本文將詳細介紹Femap許可網絡配置的方法和優勢&#xff0c;幫助您輕松實現多用戶高效協作…

計算機視覺----時域頻域在圖像中的意義、傅里葉變換在圖像中的應用、卷積核的頻域解釋

1、時域&#xff08;時間域&#xff09;——自變量是時間,即橫軸是時間,縱軸是信號的變化。其動態信號x&#xff08;t&#xff09;是描述信號在不同時刻取值的函數。 2、頻域&#xff08;頻率域&#xff09;——自變量是頻率,即橫軸是頻率,縱軸是該頻率信號的幅度,也就是通常說…

主流高防服務器技術對比與AI防御方案實戰

1. 高防服務器核心能力對比 當前市場主流高防服務商&#xff08;如阿里云、騰訊云、華為云&#xff09;的核心防御能力集中在流量清洗與靜態規則防護&#xff0c;但面臨以下挑戰&#xff1a; 靜態防御瓶頸&#xff1a;傳統方案依賴預定義規則&#xff0c;對新型攻擊&#xff…

常時間運行的程序 導致系統卡頓 自動監控系統CPU和內存利用率 自動選擇 內存回收 軟件重啟 電腦重啟

長時間運行安防系統&#xff0c;導致CPU或內存利用率超80%&#xff0c;使得電腦變的緩慢、卡頓的問題。定時獲取CPU和內存利用率的數據&#xff0c;在不同時間段&#xff08;如凌晨與平時&#xff09;&#xff0c;根據利用率的不同的閾值&#xff0c;進行&#xff1a;內存回收(…

OpenCV播放攝像頭視頻

OpenCV計算機視覺開發實踐&#xff1a;基于Qt C - 商品搜索 - 京東 播放攝像頭視頻和播放視頻文件類似&#xff0c;也是通過類VideoCapture來實現&#xff0c;只不過調用open的時候傳入的是攝像頭的索引號。如果計算機安裝了一個攝像頭&#xff0c;則open的第一個參數通常是0&…

操作系統:內存管理

目錄 1、主要目標 2、核心概念和技術 2.1 物理內存與虛擬內存 2.2 內存分頁機制 2.3 頁面置換算法 3、監控與性能優化 3.1 查看物理內存 3.2 查看虛擬內存 3.3 性能問題 1> 內存不足&#xff08;OOM&#xff09; 2> 內存泄漏 3> 內存碎片 3.4 性能優化策…