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

JS中兩個(gè)空之null和undefined深度解析

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

為什么會(huì)有兩個(gè)“空”?

在很多語(yǔ)言(如 Java、C#)中,通常只有一個(gè) null 來(lái)表示“無(wú)”。但在 JavaScript 中,Brendan Eich(JS 之父)設(shè)計(jì)了兩個(gè):

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

通俗比喻
想象你去餐廳點(diǎn)餐:

  • undefined:你坐在座位上,服務(wù)員還沒(méi)給你菜單。狀態(tài)是“未定義”,你不知道有什么菜,因?yàn)榱鞒踢€沒(méi)走到那一步。這是系統(tǒng)/環(huán)境造成的。
  • null:服務(wù)員給了你菜單,你看了一圈說(shuō):“我什么都不想要,給我來(lái)個(gè)空盤子。” 狀態(tài)是“空”,是你主動(dòng)選擇的結(jié)果。

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

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

2. 深度解析:undefined的場(chǎng)景

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

場(chǎng)景 1:變量聲明但未賦值

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

場(chǎng)景 2:訪問(wèn)對(duì)象不存在的屬性

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

場(chǎng)景 3:函數(shù)沒(méi)有返回值

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

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

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

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

3. 深度解析:null的場(chǎng)景

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

場(chǎng)景 1:初始化一個(gè)將來(lái)會(huì)存放對(duì)象的變量

let currentUser = null; // 明確表示當(dāng)前沒(méi)有用戶

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

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

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

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

場(chǎng)景 3:API 返回“無(wú)結(jié)果”

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

關(guān)鍵點(diǎn)null 代表**“意料之中的空”“主動(dòng)清空”**。

4. 類型檢測(cè)的“歷史遺留問(wèn)題”

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

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

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

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

由于修復(fù)這個(gè) Bug 會(huì)導(dǎo)致大量舊網(wǎng)站崩潰,所以 Brendan Eich 決定將錯(cuò)就錯(cuò),保留至今。

如何正確判斷null?

不要只用 typeof,要結(jié)合嚴(yán)格相等判斷:

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

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

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

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

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

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

當(dāng)你希望只有在值為 nullundefined 時(shí)才使用默認(rèn)值,而保留 0''、false 時(shí)使用:

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

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

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

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

安全地訪問(wèn)深層嵌套屬性,避免 Cannot read property of undefined 報(bào)錯(cuò)。

const user = {
  address: null,
};

// ? 傳統(tǒng)寫法,如果 address 是 null,會(huì)報(bào)錯(cuò)
// console.log(user.address.street.length);

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

6. 總結(jié)

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

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

最佳實(shí)踐原則

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

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

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

相關(guān)文章

  • png在IE6 下無(wú)法透明的解決方法匯總

    png在IE6 下無(wú)法透明的解決方法匯總

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

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

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

    手寫TypeScript?時(shí)很多人常犯的幾個(gè)錯(cuò)誤

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

    JavaScript 在線壓縮和格式化收藏

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

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

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

    5 種JavaScript編碼規(guī)范

    編碼規(guī)范就是指導(dǎo)如何編寫和組織代碼的一系列標(biāo)準(zhǔn),下面通過(guò)本文給大家?guī)?lái)了5 種JavaScript編碼規(guī)范,需要的朋友參考下
    2018-01-01
  • JavaScript中的變量聲明你知道嗎

    JavaScript中的變量聲明你知道嗎

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

    uniapp開(kāi)發(fā)小程序的經(jīng)驗(yàn)總結(jié)

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

    一文詳解為什么你的TypeScript項(xiàng)目里總會(huì)有幾個(gè).d.ts文件

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

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

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

最新評(píng)論

兴仁县| 星子县| 贞丰县| 积石山| 八宿县| 卫辉市| 高淳县| 五台县| 聂荣县| 海宁市| 万荣县| 拉孜县| 黎川县| 武邑县| 五莲县| 广灵县| 道孚县| 东乌| 巴塘县| 富宁县| 虹口区| 改则县| 买车| 黑龙江省| 彰化市| 武穴市| 隆子县| 宜州市| 山西省| 九台市| 平乐县| 南宫市| 天津市| 铜鼓县| 榕江县| 石泉县| 沧源| 磴口县| 英超| 二连浩特市| 潢川县|