null 和 undefined 在 JavaScript 是最常見的空問題。
null 和 undefined 的定義
JavaScript 的最初版本是這樣區分的:
- null是一個表示"無"的對象,轉為數值時為 0;
- undefined是一個表示"無"的原始值,轉為數值時為NaN。
下圖對上面的 2 個概念進行了對比:
為什么會出現這個問題
這個和 JavaScript 的語言特性有關。
在最開始的時候,JavaScript 通常會被定義為是一個解釋型語言。這個語言的特點是不需要編譯,直接解釋使用。
同時 JavaScript 為了增強語言的靈活性,又被設計為弱類型語言。
換句話說,在上面的定義的 null 的時候,是可以直接對應整數類型的,這個就對代碼在執行的時候帶來很多困惑。
針對編譯類型和強類型語言來說,這個就非常頭疼。
比如說在 Java 中,如果你需要使用一個字符串 string 之前,你必須要先定義這個字符串,你可以給字符串賦 null ,或者初始化一些字符,但是你必須要定義。
否則在后面引用的時候就會報錯,JavaScript 就不需要這樣,直接用就行,這個時候,如果你壓根就沒有定義一個變量,然后就直接用,那么就會出現 undefined 的錯誤。
在強類型語言中,如果你定義變量為字符串,那么你就只能往這個變量里面存字符串,如果你存其他類型的話,編譯器會報錯。JavaScript 會嘗試自動給你類型轉換,這個就帶來不少困惑的問題,比如說在變量中存的 1 ,這個可能是整數 1 ,也可能是布爾類型。
如何判斷
可以使用 _.isNil()
函數來進行判斷。
檢查 value
是否是 null
或者 undefined
。
需要注意的是,如果你的輸入值是 ''
的話,這個函數是沒有辦法判斷的。