全面解析JavaScript 中 null
JavaScript 有兩種類型:原始類型(strings, booleans, numbers, symbols)和對象
對象是一個復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。最簡單的 JavaScript 對象是普通對象 —— 鍵和相關(guān)值的集合
let myObject = {
name: 'Eric Cartman'
};但是很多情況下不能創(chuàng)建一個對象。在這種情況下,JavaScript 提供了一個特殊的值 null —— 表示缺少對象
let myObject = null;
在這篇文章中,你將學(xué)習(xí)關(guān)于 JavaScript 中的 null 的一切: 它的含義,如何檢測它,null 和 undefined 之間的區(qū)別,以及為什么大量使用 null 會造成代碼維護(hù)困難等
1.null 的概念
JavaScript 規(guī)范中這么描述 null
null 是一種原始類型,表示有意不包含任何對象值
如果您看到 null(分配給變量或由函數(shù)返回),那么在那個位置原本應(yīng)該是一個對象,但由于某種原因,一個對象沒有創(chuàng)建
比如,函數(shù) greetObject() 創(chuàng)建對象,但也可以在無法創(chuàng)建對象時(shí)返回 null:
function greetObject(who) {
if (!who) {
return null;
}
return { message: `Hello, ${who}!` };
}
greetObject('Eric'); // => { message: 'Hello, Eric!' }
greetObject(); // => null當(dāng)上面的函數(shù)中傳入一個字符串參數(shù)時(shí),如預(yù)期的,函數(shù)返回一個對象 { message: 'Hello, Eric!' }
但是,函數(shù)中不傳任何參數(shù)時(shí),該函數(shù)返回 null。返回 null 是合理的,因?yàn)?who 參數(shù)沒有值,導(dǎo)致 greeting 對象無法創(chuàng)建
1.1 null 的一個比較貼切的比喻
考慮關(guān)于 null 的一個比較貼切的比喻,你可以把變量想象成一個盒子。就像變量可以容納對象一樣,盒子也可以容納像茶壺等的物品
但一旦你收到一個盒子,打開它,什么也沒有!有人弄錯了,給了你一個空盒子。該盒子不包含任何內(nèi)容,或者換句話說,它包含一個 null 值
2. 如何去檢測 null
檢查 null 好方法是使用嚴(yán)格相等運(yùn)算符
const missingObject = null;
const existingObject = { message: 'Hello!' };
missingObject === null; // => true
existingObject === null; // => falsemissingObject === null 的結(jié)果為 true,因?yàn)?missingObject 變量包含一個 null 值。如果變量包含非空值,比如對象,則表達(dá)式 existingObject === null 的結(jié)果為 false
2.1 null 是一個假值
null 與 false、0、"、undefined、NaN 都是假值。如果在條件語句中遇到它們,那么 JavaScript 將把它們強(qiáng)制為 false
Boolean(null); // => false
if (null) {
console.log('null is truthy');
} else {
console.log('null is falsy'); // logs 'null is falsy'
}2.2 typeof null
typeof value 類型操作符可以確定值的類型。例如,類型為 15 的是 number,typeof { prop: 'Value' } 等于 object。
有趣的是,null 值類型的結(jié)果是什么
typeof null; // => 'object'
一個缺失的對象類型怎么被判斷為 object? 原來 typoef null 作為 object 是早期 JavaScript 實(shí)現(xiàn)中的一個錯誤
不要使用 typeof 操作符檢測 null 值。如前所述,使用嚴(yán)格的相等運(yùn)算符 myVar === null
如果你想使用 typeof 去檢查一個變量是否是一個對象,你必須排除掉 null 的情況
function isObject(object) {
return typeof object === 'object' && object !== null;
}
isObject({ prop: 'Value' }); // => true
isObject(15); // => false
isObject(null); // => false3. null 的陷阱
null 通常會在你希望使用對象的情況下意外出現(xiàn)。然后,如果嘗試從 null 中提取屬性,JavaScript 會拋出一個錯誤
讓我們再次使用 greetObject() 函數(shù)并嘗試從返回的對象中訪問 message 屬性
let who = ''; greetObject(who).message; // throws "TypeError: greetObject() is null"
因?yàn)?who 變量是一個空字符串,所以函數(shù)返回 null。當(dāng)從 null 訪問 message 屬性時(shí),將拋出類型錯誤錯誤
你可以通過使用 可選鏈操作符 來處理 null
let who = ''; greetObject(who)?.message ?? 'Hello, Stranger!'; // => 'Hello, Stranger!'
或者使用下一節(jié)中描述的兩種選擇。
4. null 的替代方案
當(dāng)你不能構(gòu)造一個對象時(shí),很容易返回 null。但這種做法也有缺點(diǎn)
一旦 null 出現(xiàn)在執(zhí)行堆棧中,你總是必須檢查它
我們盡量避免返回 null:
- 返回默認(rèn)對象而不是
null - 拋出錯誤而不是返回
null
讓我們回憶一下 greetObject() 函數(shù)返回 greeting 對象
當(dāng)缺少參數(shù)時(shí),可以返回一個默認(rèn)對象,而不是返回 null
function greetObject(who) {
if (!who) {
who = 'Stranger';
}
return { message: `Hello, ${who}!` };
}
greetObject('Eric'); // => { message: 'Hello, Eric!' }
greetObject(); // => { message: 'Hello, Stranger!' }或者拋出一個錯誤
function greetObject(who) {
if (!who) {
throw new Error('"who" argument is missing');
}
return { message: `Hello, ${who}!` };
}
greetObject('Eric'); // => { message: 'Hello, Eric!' }
greetObject(); // => throws an error這些實(shí)踐可以讓你完全避免處理 null
5. null vs undefined
undefined 就是未初始化的變量或?qū)ο髮傩缘闹?/p>
例如,如果在聲明變量時(shí)沒有賦初值,那么訪問該變量的結(jié)果為 undefined
let myVariable; myVariable; // => undefined
null 和 undefined 之間的主要區(qū)別是,null 表示丟失了的對象,而 undefined 表示未初始化的狀態(tài)
嚴(yán)格相等運(yùn)算符 === 區(qū)分 null 和 undefined
null === undefined; // => false
而松散相等運(yùn)算符 == 則認(rèn)為 null 和 undefined 相等
null == undefined; // => true
我使用松散相等運(yùn)算符檢查變量是否為 null 或 undefined
function isEmpty(value) {
return value == null;
}
isEmpty(42); // => false
isEmpty({ prop: 'Value' }); // => false
isEmpty(null); // => true
isEmpty(undefined); // => true6. 總結(jié)
null 是 JavaScript 中的一個特殊值,表示丟失的對象
嚴(yán)格相等運(yùn)算符判斷變量是否為空: variable === null。
typoef 操作符用于確定變量的類型(number, string, boolean)。但是,typeof 在 null 情況下會引起誤解: typeof null 結(jié)果為 object
null 和 undefined 在某種程度上是等價(jià)的,但null 表示一個丟失的對象,而 undefined 表示未初始化狀態(tài)
盡可能避免返回 null 或?qū)⒆兞吭O(shè)置為 null。因?yàn)檫@種做法會導(dǎo)致 null 值的擴(kuò)展和需要對 null 的驗(yàn)證。相反,嘗試使用具有默認(rèn)屬性的對象,或者甚至拋出錯誤會是更好的實(shí)踐
你會使用什么方法來檢查 null?
到此這篇關(guān)于關(guān)于 JavaScript 中 null 的一切的文章就介紹到這了,更多相關(guān)JavaScript null內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript用select實(shí)現(xiàn)日期控件
這篇文章主要介紹了JavaScript用select實(shí)現(xiàn)日期控件的相關(guān)資料,需要的朋友可以參考下2015-07-07
關(guān)閉瀏覽器輸入框自動補(bǔ)齊 兼容IE,FF,Chrome等主流瀏覽器
這篇文章主要介紹了關(guān)閉瀏覽器輸入框自動補(bǔ)齊 兼容IE,FF,Chrome等主流瀏覽器,需要的朋友可以參考下。希望對大家有所幫助2014-02-02
使用ef6創(chuàng)建oracle數(shù)據(jù)庫的實(shí)體模型遇到的問題及解決方案
這篇文章主要介紹了使用ef6創(chuàng)建oracle數(shù)據(jù)庫的實(shí)體模型遇到的問題及解決方案,需要的朋友可以參考下2017-11-11
javascript和jquery分別實(shí)現(xiàn)的九九乘法表代碼
javascript 九九乘法表 附j(luò)query 實(shí)現(xiàn)的九九乘法表代碼2010-03-03
antd組件Upload實(shí)現(xiàn)自己上傳的實(shí)現(xiàn)示例
這篇文章主要介紹了antd組件Upload實(shí)現(xiàn)自己上傳的實(shí)現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
JavaScript中exec函數(shù)用法實(shí)例分析
這篇文章主要介紹了JavaScript中exec函數(shù)用法,較為詳細(xì)的分析了javascript中exec函數(shù)的功能、定義及使用方法,需要的朋友可以參考下2015-06-06
Javascript基于OOP實(shí)實(shí)現(xiàn)探測器功能代碼實(shí)例
這篇文章主要介紹了Javascript基于OOP實(shí)實(shí)現(xiàn)探測器功能代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08

