淺析JavaScript中如何正確判斷null和undefined
相信寫前端開發(fā)的朋友對下面這種報錯應(yīng)該很熟悉:
Cannot read properties of undefined
有一次我加班處理問題,也是因為這一個bug。
后來才發(fā)現(xiàn),原來是一個接口返回的數(shù)據(jù)里,某個字段有時候是null導(dǎo)致的,而我沒有做判斷就直接使用了。
一、為什么需要判斷空值?
舉例如下:
// 場景1:用戶沒填姓名 const userName = undefined; console.log(userName.length); // 報錯!Cannot read properties of undefined // 場景2:接口返回空數(shù)據(jù) const apiResponse = null; console.log(apiResponse.data); // 報錯!Cannot read properties of null
所以,空值判斷是保證代碼健壯性的重要環(huán)節(jié)。
二、先搞懂:null 和 undefined 有啥區(qū)別?
雖然它們都表示空,但含義不同:
undefined:變量被聲明了,但還沒賦值。
let name; console.log(name); // undefined
null:程序員主動賦值為空,表示我明確知道這里沒有值。
let user = null; // 表示“用戶不存在”
所以,當(dāng)我們說判斷變量是否為空,通常是指:它是不是 null 或 undefined。
三、判斷方法
以下介紹了比較常用的幾種判斷方案。
方法一:顯式比較(最保險)
if (variable === null || variable === undefined) {
console.log('變量為空');
}
適用場景:
- 需要明確區(qū)分null和undefined時
- 團(tuán)隊代碼規(guī)范要求嚴(yán)格相等判斷
- 對代碼可讀性要求高的項目
案例:
function getUserProfile(user) {
if (user === null || user === undefined) {
return '用戶不存在';
}
return `歡迎,${user.name}`;
}
方法二:非嚴(yán)格相等(最常用)
if (variable == null) {
console.log('變量為空');
}
這里有個重要知識點:== null 實際上等價于 === null || === undefined,這是JavaScript的語言特性。
為什么推薦這個寫法?
- 代碼簡潔,少寫很多字符
- 性能優(yōu)秀,現(xiàn)代JS引擎都做了優(yōu)化
- 意圖明確,專業(yè)開發(fā)者一看就懂
方法三:邏輯非操作符
if (!variable) {
console.log('變量為falsy值');
}
注意! 這個方法容易造成其它的誤傷:
// 這些值都會被判斷為"空"
!false // true
!0 // true
!"" // true
!NaN // true
// 實際開發(fā)中的坑
const count = 0;
if (!count) {
console.log('計數(shù)為0'); // 這里會執(zhí)行,但可能不是我們想要的
}
方法四:typeof 關(guān)鍵字(安全的寫法)
if (typeof variable === 'undefined' || variable === null) {
console.log('變量是空的!');
}
安全在哪?
// 如果變量根本沒聲明,前兩種方法會報錯
if (notDeclaredVariable == null) { // 報錯!ReferenceError
}
if (typeof notDeclaredVariable === 'undefined') { // 正常運行!
console.log('變量未定義');
}
這種寫法主要用于檢查一個變量是否被聲明過,但對于普通函數(shù)參數(shù)或已聲明變量,沒必要這么復(fù)雜。
適用于不確定變量是否聲明的場景。
方法五:空值合并操作符(現(xiàn)代寫法)
這是ES2020的新特性,用起來特別順手:
// 傳統(tǒng)寫法 const name = username ? username : '匿名用戶'; // 現(xiàn)代寫法 const name = username ?? '匿名用戶';
優(yōu)勢:只對 null 和 undefined 生效,不會誤判0、false等其他值。
方法六:可選鏈操作符(對象屬性專用)
處理嵌套對象時,這個功能簡直是救命稻草:
// 以前的痛苦寫法 const street = user && user.address && user.address.street; // 現(xiàn)在的優(yōu)雅寫法 const street = user?.address?.street;
結(jié)合空值合并,寫法更加安全:
const street = user?.address?.street ?? '地址未知';
四、實際開發(fā)中的建議
場景1:簡單的空值檢查
// 推薦
if (value == null) {
// 處理空值
}
// 或者
const safeValue = value ?? defaultValue;
場景2:需要區(qū)分null和undefined
if (value === null) {
console.log('明確設(shè)置為空');
}
if (value === undefined) {
console.log('未定義');
}
場景3:處理對象屬性
// 安全訪問深層屬性 const phone = order?.customer?.contact?.phone ?? '未填寫';
場景4:函數(shù)參數(shù)默認(rèn)值
function createUser(name, age = 18) {
// age參數(shù)只在undefined時使用默認(rèn)值
return { name, age };
}
五、總結(jié)
雖然現(xiàn)代JavaScript引擎優(yōu)化得很好,但了解原理還是有幫助的:
== null和顯式比較性能相當(dāng)typeof檢查稍慢,但能安全檢測未聲明變量- 可選鏈操作符在現(xiàn)代瀏覽器中性能優(yōu)秀
| 場景 | 推薦寫法 | 原因 |
|---|---|---|
| 一般空值檢查 | value == null | 簡潔高效 |
| 需要明確意圖 | value === undefined | 可讀性強 |
| 設(shè)置默認(rèn)值 | value ?? defaultValue | 安全準(zhǔn)確 |
| 對象屬性訪問 | obj?.prop | 避免報錯 |
| 函數(shù)參數(shù) | 參數(shù)默認(rèn)值 | 語言特性 |
沒有絕對最好的方法,只有最適合當(dāng)前場景的選擇。根據(jù)你的具體需求和團(tuán)隊規(guī)范來決策吧!
到此這篇關(guān)于淺析JavaScript中如何正確判斷null和undefined的文章就介紹到這了,更多相關(guān)JavaScript判斷null和undefined內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript實現(xiàn)圖像循環(huán)明暗變化的方法
這篇文章主要介紹了javascript實現(xiàn)圖像循環(huán)明暗變化的方法,實例分析了javascript操作css樣式的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-02-02
javascript實現(xiàn)textarea中tab鍵的縮排處理方法
這篇文章主要介紹了javascript實現(xiàn)textarea中tab鍵的縮排處理方法,涉及javascript處理鼠標(biāo)事件及頁面元素的相關(guān)技巧,需要的朋友可以參考下2015-06-06
js以分隔符分隔數(shù)組中的元素并轉(zhuǎn)換為字符串的方法
下面小編就為大家?guī)硪黄猨s以分隔符分隔數(shù)組中的元素并轉(zhuǎn)換為字符串的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11
JavaScript對象和字串之間的轉(zhuǎn)換實例探討
從對象的格式可以看出,如果字串的格式定義成 json 格式的, 就可以直接轉(zhuǎn)換為obj了,感興趣的朋友可以參考下哈2013-04-04
微信小程序中如何使用xlsx(xlsx.mini.min.js)實現(xiàn)Excel導(dǎo)入導(dǎo)出功能
這篇文章主要介紹了微信小程序中如何使用xlsx(xlsx.mini.min.js)實現(xiàn)Excel導(dǎo)入導(dǎo)出功能的相關(guān)資料,包括準(zhǔn)備工作、導(dǎo)出Excel的基本流程、導(dǎo)入Excel的基本流程、常用API說明以及注意事項,需要的朋友可以參考下2026-01-01

