JS 中判斷 null、undefined 與 NaN 的權威方法及場景實踐

在 JavaScript 中,nullundefined?和?NaN?是三個特殊的「非正常值」,正確判斷它們是保證代碼健壯性的關鍵。本文結合 ECMA 規范與 MDN 權威文檔,系統梳理三者的判斷方法、原理及典型場景,幫助開發者規避常見誤區。

一、理解三個特殊值的本質

  • undefined:表示「變量未初始化」或「對象屬性未顯式賦值」(如聲明變量未賦值、訪問不存在的對象屬性)。
  • null:表示「有意為之的空值」(通常用于表示「空對象」,如?let obj = null)。
  • NaN(Not a Number):表示「非數字」,常見于數值計算失敗場景(如?0/0"abc" - 1)。

二、判斷?undefined?的權威方法

undefined?的核心特征是「未初始化」,判斷時需注意兼容性。

1. 使用?typeof(推薦,兼容未聲明變量)

typeof?返回變量的類型字符串("undefined"?表示未初始化)。即使變量未聲明,typeof?也不會拋出錯誤,適合安全檢查。

javascript

// 變量已聲明但未初始化
let a; 
console.log(typeof a === "undefined"); // true// 檢查對象不存在的屬性(安全)
const obj = { name: "張三" };
console.log(typeof obj.age === "undefined"); // true(age屬性未定義)// 變量未聲明(不會報錯)
console.log(typeof b === "undefined"); // true(b未聲明)
2. 直接比較?=== undefined(需變量已聲明)

若變量已聲明,可通過嚴格等于?undefined?判斷,但未聲明變量會拋出?ReferenceError

javascript

let c; 
console.log(c === undefined); // true(變量已聲明未初始化)// 未聲明變量直接比較會報錯!
// console.log(d === undefined); // Uncaught ReferenceError: d is not defined

三、判斷?null?的權威方法

null?是「主動設置的空對象」,需嚴格區分于其他值。

唯一可靠方式:=== null

typeof null?會返回?"object"(歷史遺留問題),因此必須通過嚴格等于?null?判斷。

javascript

const obj = null;
console.log(obj === null); // true(正確判斷null)// 錯誤示例:typeof無法區分null和對象
console.log(typeof null); // "object"(無法用typeof判斷null)

四、判斷?NaN?的權威方法

NaN?是唯一不滿足?x === x?的值(NaN !== NaN),判斷需結合其特性。

1. ES6 新增?Number.isNaN(嚴格判斷,推薦)

僅當值本身是?NaN?時返回?true,不會隱式轉換其他類型。

javascript

console.log(Number.isNaN(NaN)); // true(直接判斷NaN)
console.log(Number.isNaN("abc" - 1)); // true(計算結果為NaN)
console.log(Number.isNaN("123")); // false(字符串不是NaN)
2. 傳統?isNaN(非嚴格,需謹慎)

先將參數隱式轉換為數字,再判斷是否為?NaN,可能誤判其他類型。

javascript

console.log(isNaN(NaN)); // true(正確)
console.log(isNaN("abc")); // true("abc"轉數字為NaN)
console.log(isNaN("123")); // false("123"轉數字為123)
3. 利用?NaN !== NaN?特性(兼容舊環境)

NaN?是唯一不滿足自身相等的值,可手動實現判斷函數。

javascript

function isNaNPolyfill(value) {return value !== value; 
}
console.log(isNaNPolyfill(NaN)); // true
console.log(isNaNPolyfill("abc" - 1)); // true(結果為NaN)

五、綜合場景與補充方法

實際開發中,需根據需求靈活組合判斷邏輯。

場景 1:統一判斷?null?或?undefined

利用寬松相等(null == undefined?為?true),快速判斷兩者。

javascript

const value = null;
if (value == null) { // 等價于 value == undefinedconsole.log("值為null或undefined"); // 觸發
}
場景 2:函數參數默認值處理(ES6 解構賦值)

解構賦值的默認值僅在參數為?null?或?undefined?時生效,其他假值(如?0)不觸發。

javascript

function getUserInfo({ age = "未知" } = {}) { console.log(`年齡:${age}`);
}getUserInfo({ age: null }); // 輸出 "年齡:未知"(null觸發默認值)
getUserInfo({ age: 0 }); // 輸出 "年齡:0"(0是有效值,不觸發默認值)
場景 3:使用工具庫(如 Lodash)

成熟工具庫提供語義化方法,提升代碼可讀性。

javascript

import { isNil, isNull, isUndefined } from "lodash";isNull(null); // true(僅判斷null)
isUndefined(undefined); // true(僅判斷undefined)
isNil(null); // true(判斷null或undefined)
isNil(undefined); // true

六、總結與最佳實踐

權威判斷方法適用場景
undefinedtypeof value === "undefined"安全檢查未聲明變量或對象屬性
nullvalue === null明確判斷「主動設置的空對象」
NaNNumber.isNaN(value)(ES6)嚴格判斷非數字結果
綜合判斷value == null(null/undefined)
lodash.isNil(工具庫)
無需區分 null 和 undefined 時快速過濾

參考規范

  • ECMA-262 規范:typeof、Null、NaN。
  • MDN 文檔:undefined、null、NaN。

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

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

相關文章

基于DenseNet的醫學影像輔助診斷系統開發教程

本文源碼地址: https://download.csdn.net/download/shangjg03/90873921 1. 簡介 本教程將使用DenseNet開發一個完整的醫學影像輔助診斷系統,專注于胸部X光片的肺炎檢測。我們將從環境搭建開始,逐步介紹數據處理、模型構建、訓練、評估以及最終的系統部署。 2. 環境準備<…

ubuntu ollama /Dify/Docker部署大模型

電腦需要顯卡&#xff1a; 執行下載并安裝&#xff1a; curl -fsSL https://ollama.com/install.sh | sh 安裝完后到Ollama Search 中查看ollama 可以部署的模型有哪些&#xff1a; 我選擇gemma3,所以執行&#xff1a; ollma pull gemma3:latest 這樣就把gemma3:latest 模…

課程發布與學習流程全解析

流程 課程發布Controller 獲取課程發布信息 ApiOperation("獲取課程發布信息") ResponseBody GetMapping("/course/whole/{courseId}") public CoursePreviewDto getPreviewInfo(PathVariable("courseId") Long courseId) {CoursePreviewDto c…

Linux的讀寫屏障

在 Linux 中&#xff0c;讀寫屏障&#xff08;Read-Write Barriers&#xff0c;簡稱 RWB&#xff09;是對內存訪問順序的一種控制機制&#xff0c;用來保證在多核處理器環境下&#xff0c;內存訪問的正確順序&#xff0c;避免因亂序執行導致的數據一致性問題。它是操作系統內核…

Spring AI 和 Elasticsearch 作為你的向量數據庫

作者&#xff1a;來自 Elastic Josh Long, Philipp Krenn 及 Laura Trotta 使用 Spring AI 和 Elasticsearch 構建一個完整的 AI 應用程序。 Elasticsearch 原生集成了業界領先的生成式 AI 工具和服務提供商。查看我們關于超越 RAG 基礎或使用 Elastic 向量數據庫構建生產級應用…

TDengine 高可用——雙活方案

概述 部分用戶因為部署環境的特殊性只能部署兩臺服務器&#xff0c;同時希望實現一定的服務高可用和數據高可靠。本文主要描述基于數據復制和客戶端 Failover 兩項關鍵技術的 TDengine 雙活系統的產品行為&#xff0c;包括雙活系統的架構、配置、運維等。TDengine 雙活既可以用…

與 JetBrains 官方溝通記錄(PyCharm 相關問題反饋)

#工作記錄 溝通記錄&#xff1a; Subject: Feedback on Terminal and Environment Activation Issues in PyCharm : PY-81233 溝通進度&#xff1a; 【筆記】記一次PyCharm的問題反饋_the polyglot context is using an implementation th-CSDN博客 【筆記】與PyCharm官方溝通…

前端實戰:用 JavaScript 模擬文件選擇器,同步實現圖片預覽與 Base64 轉換

代碼 function 仙盟插件_通用_圖片_上傳(人間通道id,檢驗關卡img,仙界指引id){const 人間通道 document.getElementById(人間通道id);const 檢驗關卡 document.getElementById(檢驗關卡img);const 仙界指引 document.getElementById(仙界指引id);人間通道.addEventListener(…

數據庫設計文檔撰寫攻略

數據庫設計文檔撰寫攻略 一、數據庫設計文檔的核心價值二、數據庫設計文檔的核心框架與內容詳解2.1 文檔基礎信息2.2 需求分析與設計原則2.2.1 業務需求概述2.2.2 設計原則 2.3 數據模型設計2.3.1 概念模型&#xff08;ER 圖&#xff09;2.3.2 邏輯模型&#xff08;表結構設計&…

3D個人簡歷網站 7.聯系我

3D個人簡歷網站 7.聯系我 修改Contact.jsx // 從 react 庫導入 useRef 和 useState hooks import { useRef, useState } from "react";/*** Contact 組件&#xff0c;用于展示聯系表單&#xff0c;處理用戶表單輸入和提交。* returns {JSX.Element} 包含聯系表單的 …

AI大模型從0到1記錄學習numpy pandas day25

第 3 章 Pandas 3.1 什么是Pandas Pandas 是一個開源的數據分析和數據處理庫&#xff0c;它是基于 Python 編程語言的。 Pandas 提供了易于使用的數據結構和數據分析工具&#xff0c;特別適用于處理結構化數據&#xff0c;如表格型數據&#xff08;類似于Excel表格&#xff09;…

一些可以優化JavaScript性能的工具或庫匯總

在 JavaScript 性能優化方面,有許多實用的工具和庫可以幫助你分析、監控和提升代碼性能。以下是一些常用的工具和庫分類整理: 一、性能分析工具 這些工具用于診斷性能瓶頸,定位問題代碼。 Chrome DevTools Performance 面板:分析運行時性能,記錄函數執行時間、內存使用、…

Linux | tmux | 無法復制粘貼

問題&#xff1a;在Linux中使用tmux時&#xff0c;總是沒法使用復制粘貼功能&#xff1b; 解決: 如果希望直接用鼠標選擇并復制&#xff08;類似普通終端&#xff09;&#xff0c;可以&#xff1a; 在 ~/.tmux.conf 中添加&#xff1a;sh set -g mouse on;重新加載 tmux 配置…

行賄罪案件(公安偵查階段)詢問筆錄發問提綱

一、基本情況核實 與行賄對象&#xff08;受賄人&#xff09;的關系&#xff1f;何時通過何種方式認識&#xff1f;日常交往頻率及主要內容&#xff1f; 是否具備國家工作人員身份或其他特定主體資格&#xff1f;是否屬于被追訴單位的直接責任人員&#xff1f; 二、行賄動機與…

活到老學到老-Spring參數校驗注解Validated /Valid

通過 Validated 和 Valid可以對請求的進行參數校驗。 1.核心對比&#xff1a; 特性Valid (JSR-303)Validated (Spring)來源Java標準規范Spring框架擴展分組校驗不支持支持&#xff08;通過groups屬性&#xff09;嵌套路徑自動處理級聯校驗需配合Valid生效應用范圍方法參數、屬…

【筆記】JetBrains 數據遷移與符號鏈接操作

數據遷移與符號鏈接操作 一、備份原始數據 使用 robocopy 命令備份 C 盤中的源文件夾&#xff0c;確保原始數據完整備份。 robocopy "C:\Users\love\AppData\Local\JetBrains" "E:\Downloads\Other\JetBrains" /E確保備份路徑足夠存儲空間。 二、復制文…

使用 Terraform 創建 Azure Databricks 工作區

使用 Terraform 創建 Azure Databricks Terraform 是一種基礎設施即代碼(IaC)工具,允許用戶通過聲明式配置文件來管理和部署云資源。Azure Databricks 是一個基于 Apache Spark 的分析平臺,專為數據工程和數據科學設計。通過 Terraform,可以自動化 Azure Databricks 的創…

【zookeeper】--部署3.6.3

文章目錄 下載解壓創建data和logs配置文件1)創建目錄并且編輯 zoo.cfg2)接下來將 node01 的 ZooKeeper 所有文件拷貝至 node02 和 node03。推薦從 node02 和 node03 拷貝4&#xff09;最后 vim /etc/profile 配置環境變量&#xff0c;環境搭建結束。配完環境變量后 source /etc…

RxJS 核心操作符詳細用法示例

1. Observable 詳細用法 Observable 是 RxJS 的核心概念&#xff0c;代表一個可觀察的數據流。 創建和訂閱 Observable import { Observable } from "rxjs";// 1. 創建Observable const myObservable new Observable(subscriber > {// 發出三個值subscriber.n…

QGrphicsScen畫布網格和QGrphicsItem對齊到網格

#include <QGraphicsScene> #include <QPainter> #include <QWheelEvent> #include <QGraphicsView> class MyGraphicsView : public QGraphicsView { public:MyGraphicsView(QGraphicsScene* scene) : QGraphicsView(scene){}protected:// 重寫滾輪事…