為什麼需要「空值」?
在前面的文章中,我們認識了好幾種 JavaScript 的資料值(Value):數字、字串、布林值。
這些值都帶有明確的資訊——42 代表一個數字,"Hello" 代表一段文字,true 代表「是」。
但在前面的文章中,我們其實已經碰過一種情況:運算沒辦法產生有意義的結果。
例如 0 / 0 會得到 NaN,因為這個運算在數學上沒有定義,JavaScript 算不出一個有意義的數字。
NaN 是數字型態裡用來表示「沒有意義的結果」的標記。
但如果不是數字運算呢?如果是其他類型的操作,也產生不了有意義的結果,JavaScript 該回傳什麼?
想像你去圖書館的查詢系統查一本書,但這本書根本不存在。
查詢系統不會什麼都不回應,它還是會給你一個畫面,上面寫著「查無資料」。
「查無資料」本身就是一種回應,只是它不帶有任何實際的資訊——它沒有告訴你書名、作者、在哪個書架,它只是告訴你「沒有東西」。
JavaScript 也是一樣的邏輯:有些操作沒辦法產生有意義的結果,但 JavaScript 的規則是不管怎樣都必須回傳一個值,所以它會回傳一個代表「沒有東西」的值。
這就是 null 和 undefined 存在的原因——它們就是 JavaScript 版本的「查無資料」。
JavaScript 的 undefined 和 null 是什麼?
JavaScript 有兩個特殊的值,專門用來表示「沒有東西」:undefined 和 null。
用前面圖書館的例子來說明它們的差別:
undefined:JavaScript 自動回應的「查無資料」
undefined 的意思是「未定義」。
你去查詢系統查一本書,系統自動回應你「查無資料」。
這個「查無資料」不是誰故意設定的,而是系統在找不到東西的時候,自動給你的預設回應。
undefined 就是 JavaScript 版本的「查無資料」。
當 JavaScript 進行某些操作,但沒有值可以回傳的時候,它就會自動給你一個 undefined,代表「我沒有東西可以給你」。
具體會在什麼情況下碰到 undefined,在後續的文章中你會陸續看到。
null:開發者主動設定的「此處目前無書」
那 null 呢?
null 的意思是「空值」。
這次不是系統自動回應「查無資料」,而是圖書館員主動在某個書架上貼了一張紙條,寫著「此處目前無書」。
書架是存在的,只是圖書館員刻意讓它是空的。
null 就是這個概念——它是開發者主動設定的,用來表示「我知道這裡可以有值,但我刻意讓它是空的」。
undefined 和 null 的差別與共同點
簡單來說,兩者的差別在於:
undefined 是 JavaScript 自動產生的,像系統自動回應的「查無資料」。
null 是開發者主動設定的,像圖書館員刻意貼上的「此處目前無書」。
雖然兩者的來源不同,但它們有一個重要的共同點:
兩者都是資料值(Value),但都不帶有任何實際的資訊。
42 告訴你「這是數字 42」,"Hello" 告訴你「這是一段文字」。
但 null 和 undefined 什麼都沒告訴你,它們只是表示「這裡沒有東西」。
null 和 undefined 在實務上的差異重要嗎?
說到這裡,你可能還是覺得很困惑:既然兩個都是「沒有值」,那為什麼要有兩個?
老實說,null 和 undefined 兩者之間在意義上的差異,其實是 JavaScript 設計上的一個歷史意外。
JavaScript 是由 Brendan Eich 在 1995 年用大約 10 天的時間趕出來的。
當時他參考了 Java 這個程式語言,Java 裡有 null 來表示「空值」,所以 JavaScript 也加入了 null。
但 Brendan Eich 覺得,光有一個 null 不夠——他還想要一個值來表示「根本還沒有被設定過」,於是他又另外加了 undefined。
結果就是,JavaScript 變成了一個有兩種「沒有東西」的語言。
大多數其他程式語言只有一個(通常就是 null),但 JavaScript 有兩個,而且在很多情況下,它們的行為幾乎一樣,這讓不少開發者覺得困惑。
就連 Brendan Eich 自己後來也承認,同時擁有兩個空值是一個設計失誤。
但問題是,全世界已經有無數的網站和程式在使用 null 和 undefined,如果 JavaScript 突然把其中一個拿掉,那些已經寫好的程式就會壞掉。
所以即使大家都知道這是個設計失誤,JavaScript 也只能繼續保留這兩個值,沒辦法移除。
在大多數情況下,這個差異並不重要。
如果你現在很糾結這兩個到底什麼時候該用哪一個,不用太擔心——在這個階段,你可以把它們當成可以互換的值,都代表「沒有東西」。
隨著後面的學習,你會慢慢碰到它們各自出現的場景,到時候自然就會理解它們的差別了。
小結
undefined代表「還沒有被給予值」,通常是 JavaScript 自動產生的。null代表「刻意設定為空值」,通常是開發者主動設定的。- 兩者都是資料值,但都不帶有任何實際的資訊。
- 在初學階段,可以把
null和undefined當成可以互換的值,不用太糾結它們的差異。