最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS中兩個空之null和undefined深度解析

 更新時間:2026年05月27日 11:34:36   作者:yqcoder  
在JavaScript中,null和undefined都是表示無或者空的值,但它們之間存在一些重要的區(qū)別,這篇文章主要介紹了JS中兩個空之null和undefined的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

為什么會有兩個“空”?

在很多語言(如 Java、C#)中,通常只有一個 null 來表示“無”。但在 JavaScript 中,Brendan Eich(JS 之父)設計了兩個:

  1. undefined:表示**“缺失”**。系統(tǒng)自動分配的,意思是“這里應該有個值,但現(xiàn)在還沒給”。
  2. null:表示**“空無”**。開發(fā)者手動設置的,意思是“這里本來可以有值,但我特意把它清空了”。

通俗比喻
想象你去餐廳點餐:

  • undefined:你坐在座位上,服務員還沒給你菜單。狀態(tài)是“未定義”,你不知道有什么菜,因為流程還沒走到那一步。這是系統(tǒng)/環(huán)境造成的。
  • null:服務員給了你菜單,你看了一圈說:“我什么都不想要,給我來個空盤子。” 狀態(tài)是“空”,是你主動選擇的結果。

1. 核心區(qū)別對比表

特性undefinednull
含義未定義、缺失、尚未賦值空對象指針、有意為空
來源系統(tǒng)/引擎自動分配開發(fā)者手動賦值
類型 (typeof)"undefined""object" (歷史 Bug)
數(shù)值轉換NaN0
布爾轉換falsefalse
相等性undefined == null (true)undefined === null (false)

2. 深度解析:undefined的場景

undefined 通常出現(xiàn)在以下幾種“被動”場景中:

場景 1:變量聲明但未賦值

let name;
console.log(name); // undefined

場景 2:訪問對象不存在的屬性

const user = { name: "Alice" };
console.log(user.age); // undefined (屬性不存在)

場景 3:函數(shù)沒有返回值

function doNothing() {}
console.log(doNothing()); // undefined

場景 4:函數(shù)參數(shù)未傳遞

function sayHi(name) {
  console.log(name);
}
sayHi(); // undefined

關鍵點undefined 代表**“意料之外的缺失”“初始狀態(tài)”**。

3. 深度解析:null的場景

null 通常出現(xiàn)在以下“主動”場景中:

場景 1:初始化一個將來會存放對象的變量

let currentUser = null; // 明確表示當前沒有用戶

// ... 后續(xù)邏輯 ...
if (loginSuccess) {
  currentUser = { id: 1, name: "Bob" };
}

場景 2:釋放內(nèi)存引用(垃圾回收提示)

當一個對象不再需要時,將其引用設為 null,有助于 GC(垃圾回收器)識別并回收內(nèi)存。

let largeData = new Array(1000000).fill("data");
// 使用完畢...
largeData = null; // 斷開引用,幫助內(nèi)存回收

場景 3:API 返回“無結果”

后端接口查詢數(shù)據(jù)庫,如果沒有找到記錄,通常返回 null 而不是 undefined,因為 null 是一種明確的業(yè)務狀態(tài)(“查了,但沒有”)。

關鍵點null 代表**“意料之中的空”“主動清空”**。

4. 類型檢測的“歷史遺留問題”

為什么typeof null === 'object'?

這是一個著名的 JavaScript Bug,源自 JS 誕生的早期版本。
在底層實現(xiàn)中,JS 變量的類型標簽存儲在低位比特中:

  • 000: 對象 (object)
  • 001: 整數(shù) (int)
  • 010: 浮點 (double)
  • 100: 字符串 (string)
  • 110: 布爾 (boolean)

null 的機器碼全為 0 (000000)。因此,它的類型標簽也是 000,被誤判為 object。

由于修復這個 Bug 會導致大量舊網(wǎng)站崩潰,所以 Brendan Eich 決定將錯就錯,保留至今。

如何正確判斷null?

不要只用 typeof,要結合嚴格相等判斷:

function isNull(value) {
  return value === null;
}

function isUndefined(value) {
  return value === undefined;
}

// 或者判斷是否為“空值”(null 或 undefined)
function isNil(value) {
  return value == null; // 利用 == 的特性:null == undefined 為 true
}

5. 實戰(zhàn):如何優(yōu)雅地處理空值?

在現(xiàn)代 JavaScript (ES2020+) 中,我們有更優(yōu)雅的工具來處理這兩個家伙。

技巧 1:空值合并運算符 (??)

當你希望只有在值為 nullundefined 時才使用默認值,而保留 0、''false 時使用:

const config = {
  count: 0,
  name: null,
};

// ? 使用 || (邏輯或) 的陷阱:0 會被當成 false
console.log(config.count || 10); // 10 (錯誤!我們想要 0)

// ? 使用 ?? (空值合并)
console.log(config.count ?? 10); // 0 (正確!只有 null/undefined 才替換)
console.log(config.name ?? "Guest"); // "Guest"

技巧 2:可選鏈操作符 (?.)

安全地訪問深層嵌套屬性,避免 Cannot read property of undefined 報錯。

const user = {
  address: null,
};

// ? 傳統(tǒng)寫法,如果 address 是 null,會報錯
// console.log(user.address.street.length);

// ? 可選鏈:如果中間任何一環(huán)是 null/undefined,直接返回 undefined
console.log(user.address?.street); // undefined (不會報錯)
console.log(user.profile?.name); // undefined (profile 不存在)

6. 總結

維度undefinednull
本質(zhì)缺少值 (Missing)空值 (Empty)
誰給的?JS 引擎程序員
何時用?變量未初始化、屬性不存在顯式清空、初始化對象變量
推薦用法盡量讓系統(tǒng)自動產(chǎn)生,少手動賦值主動賦值,表示“此處無物”

?? 博主寄語
雖然 null == undefinedtrue,但在代碼規(guī)范中,建議嚴格區(qū)分它們。

最佳實踐原則

  1. 默認值檢查:使用 ?? 操作符。
  2. 安全訪問:使用 ?. 操作符。
  3. 變量初始化:如果變量將來要存對象,初始化為 null;如果只是聲明,讓它保持 undefined
  4. API 設計:后端返回“無數(shù)據(jù)”時用 null,前端判斷時用 == null 同時捕獲兩者。

理解這兩個“空”,能讓你寫出更健壯、更少 Bug 的代碼。

到此這篇關于JS中兩個空之null和undefined的文章就介紹到這了,更多相關JS空null和undefined內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • png在IE6 下無法透明的解決方法匯總

    png在IE6 下無法透明的解決方法匯總

    解決PNG圖片在IE6下的透明這類問題谷歌上很多解決方案,屬于非常常見的問題,以前我做的時候,這類透明我都是用gif,而直接避開png,所以到現(xiàn)在我并沒有去了解過這個問題。今天就把這個問題整理下,解決方案匯總給大家。
    2015-05-05
  • 如何使用不同的方法在 JavaScript 中添加兩個向量

    如何使用不同的方法在 JavaScript 中添加兩個向量

    這篇文章主要介紹了如何在 JavaScript 中添加向量(Vector)類,使用不同的方法在 JavaScript 中添加兩個向量,本文結合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • 手寫TypeScript?時很多人常犯的幾個錯誤

    手寫TypeScript?時很多人常犯的幾個錯誤

    這篇文章主要介紹了手寫TypeScript?時很多人常犯的幾個錯誤,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的抽卡,重要的朋友可以參考一下
    2022-09-09
  • JavaScript 在線壓縮和格式化收藏

    JavaScript 在線壓縮和格式化收藏

    國外人寫的在線壓縮和格式化工具這兩套程序都是用純 JavaScript 寫的,可以下載下來離線使用,很方便。
    2009-01-01
  • 詳解小程序如何避免多次點擊,重復觸發(fā)事件

    詳解小程序如何避免多次點擊,重復觸發(fā)事件

    這篇文章主要介紹了詳解小程序如何避免多次點擊,重復觸發(fā)事件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • 5 種JavaScript編碼規(guī)范

    5 種JavaScript編碼規(guī)范

    編碼規(guī)范就是指導如何編寫和組織代碼的一系列標準,下面通過本文給大家?guī)砹? 種JavaScript編碼規(guī)范,需要的朋友參考下
    2018-01-01
  • JavaScript中的變量聲明你知道嗎

    JavaScript中的變量聲明你知道嗎

    這篇文章主要為大家詳細介紹了JavaScript中的變量聲明,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • uniapp開發(fā)小程序的經(jīng)驗總結

    uniapp開發(fā)小程序的經(jīng)驗總結

    這篇文章主要給大家介紹了關于uniapp開發(fā)小程序的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • 一文詳解為什么你的TypeScript項目里總會有幾個.d.ts文件

    一文詳解為什么你的TypeScript項目里總會有幾個.d.ts文件

    d.ts文件用于為TypeScript提供有關用JavaScript編寫的API的類型信息,簡單講就是你可以在ts中調(diào)用的js的聲明文件,這篇文章主要介紹了為什么你的TypeScript項目里總會有幾個.d.ts文件的相關資料,需要的朋友可以參考下
    2026-05-05
  • 微信小程序五星評分效果實現(xiàn)代碼

    微信小程序五星評分效果實現(xiàn)代碼

    這篇文章主要介紹了微信小程序五星評分效果實現(xiàn)代碼的相關資料,需要的朋友可以參考下
    2017-04-04

最新評論

富锦市| 顺昌县| 昌黎县| 紫阳县| 西城区| 拉孜县| 灵武市| 石门县| 寻甸| 咸丰县| 平阴县| 高碑店市| 梅州市| 辽宁省| 全南县| 石城县| 罗甸县| 马公市| 武威市| 崇文区| 镇康县| 兴海县| 云安县| 牙克石市| 精河县| 虎林市| 手游| 容城县| 故城县| 徐水县| 林甸县| 宽甸| 米易县| 太仆寺旗| 都匀市| 绥芬河市| 西畴县| 南漳县| 青海省| 闽清县| 马尔康县|