推薦教學:《JavaScript影片教學》
#JavaScript有2種類型:基本型別(string
, booleans
number
, symbol
)和物件。
物件是複雜的資料結構,JS 中最簡單的物件是普通物件:一組鍵和關聯值:
let myObject = { name: '前端小智' }
但是在某些情況下無法建立物件。在這種情況下,JS 提供一個特殊值null
—表示缺少物件。
let myObject = null
在本文中,我們將了解有關JavaScript中null的所有知識:它的含義,如何檢測它,null
與undefined
之間的區別以及為什麼使用null
造成程式碼維護困難。
1. null的概念
JS 規範說明了有關null
的資訊:
值null
特指物件的值未設置,它是JS 基本類型之一,在布林運算中被認為是falsy
。
例如,函數greetObject()
建立對象,但是在無法建立物件時也可以返回null
:
function greetObject(who) { if (!who) { return null; } return { message: `Hello, ${who}!` }; } greetObject('Eric'); // => { message: 'Hello, Eric!' } greetObject(); // => null
但是,在不當帶參數的情況下呼叫函數greetObject()
時,函數會傳回null
。傳回null
是合理的,因為who
參數沒有值。
2. 如何檢查null
檢查null
值的好方法是使用嚴格相等運算子:
const missingObject = null; const existingObject = { message: 'Hello!' }; missingObject === null; // => true existingObject === null; // => false
missingObject === null
的結果為true
,因為missingObject
變數包含一個null
值。
如果變數包含非空值(例如物件),則表達式existObject === nul
l的計算結果為false
。
2.1 null 是虛值
null
與false
、0
、 ''
、undefined
、NaN
都是虛值。如果在條件語句中遇到虛值,那麼 JS 將會強制虛值為false
。
Boolean(null); // => false if (null) { console.log('null is truthy') } else { console.log('null is falsy') }
2.2 typeof null
typeof value
運算子決定值的型別。例如,typeof 15是'number'
,typeof {prop:'Value'}
的計算結果是'object'
。
有趣的是,type null
的結果是什麼
typeof null; // => 'object'
為什麼是'object'
,typoef null
為object
是早期JS 實作中的錯誤。
要使用typeof
運算子來偵測null
值。如前所述,使用嚴格等於運算子myVar === null
。
如果我們想使用typeof
運算子檢查變數是否是對象,我們還需要排除null
值:
function isObject(object) { return typeof object === 'object' && object !== null; } isObject({ prop: 'Value' }); // => true isObject(15); // => false isObject(null); // => false
3. null 的陷阱
null
經常會在我們認為該變數是物件的情況下意外出現。然後,如果從null
中提取屬性,JS 會拋出錯誤。
再次使用greetObject()
函數,並嘗試從傳回的物件存取message
屬性:
let who = ''; greetObject(who).message; // throws "TypeError: greetObject() is null"
因為who
變數是一個空字串,所以該函數傳回null
。從null
存取message
屬性時,將引發TypeError
錯誤。
可以透過使用帶有空值合併的可選連結來處理null
:
let who = '' greetObject(who)?.message ?? 'Hello, Stranger!' // => 'Hello, Stranger!'
4. null 的替代方法
當無法建構物件時,我們通常的做法是傳回null
,但是這種做法有缺點。在執行堆疊中出現null
時,剛必須進行檢查。
嘗試避免返回null
的做法:
null
null
回到開始返回greeting
物件的greetObject()
函數。缺少參數時,可以傳回一個預設對象,而不是返回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
這兩種做法可以避免使用null
。
5. null
vs undefined
undefined
是未初始化的變數或物件屬性的值,undefined
是未初始化的變數或物件屬性的值。
let myVariable; myVariable; // => undefined
null
和undefined
之間的主要區別是,null
表示遺失的對象,而undefined
表示未初始化的狀態。
嚴格的相等運算符===
區分null
和undefined
:
null === undefined // => false
而雙等運算子==
則認為null
和undefined
相等
null == undefined // => true
我使用双等相等运算符检查变量是否为null
或undefined
:
function isEmpty(value) { return value == null; } isEmpty(42); // => false isEmpty({ prop: 'Value' }); // => false isEmpty(null); // => true isEmpty(undefined); // => true
6. 总结
null
是JavaScript中的一个特殊值,表示丢失的对象,严格相等运算符确定变量是否为空:variable === null
。
typoef
运算符对于确定变量的类型(number
, string
, boolean
)很有用。 但是,如果为null
,则typeof会产生误导:typeof null
的值为'object'
。
null
和undefined
在某种程度上是等价的,但null
表示缺少对象,而undefined
未初始化状态。
更多编程相关知识,请访问:编程视频课程!!
以上是深入了解JavaScript中的null的詳細內容。更多資訊請關注PHP中文網其他相關文章!