iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 4
0

Tricky Undefined & Null

今天這一章我們就來看一下前面沒細談的Undefined & Null types ! 一般在其他程式語言Null是被當作一個空值的,而在Javascript也是,但Javascript中又有另一個Undefined的type,,當這兩個做比較的時候會有很神奇的事情發生。

https://ithelp.ithome.com.tw/upload/images/20171223/20107670awh0kmJbmT.png

上圖中,當兩者用 == 比較時,是True,原因是兩個都代表著此變數不帶值, 而 === ,是較嚴謹的比較方式,連Type都會納入考量,所以是false。 同樣都代表著空值兩者差異到底在哪,但要說Undefined為不帶值聽起來是挺怪的我們下面會再解釋。

而通常我們如果想要假設某變數為空值,我們會用null而不會主動塞給變數undefined。

https://ithelp.ithome.com.tw/upload/images/20171223/20107670Zr192ehJ8q.png

除了相異處,兩者也有共通點,例如兩者的Boolean default都是false。

https://ithelp.ithome.com.tw/upload/images/20171223/20107670Y0TJsfioA4.png

但聰明如你,一定會試著用typeof 一窺他們的秘密,此時你會發現一個天大的消息,相信你一定重複按了很多次,嚴重懷疑是不是自己打錯了或是語法出了問題。

https://ithelp.ithome.com.tw/upload/images/20171223/201076706pmRAmgXoz.png

太誇張了真的,比扯鈴還扯,為什麼type null 不是null?這得追溯到Javscript的歷史了,但我是印象派,只喜歡個大概,所以為什麼會這樣就請看官有興趣自行上網查閱(超不負責XD)。

至於為什麼到至今的版本中,仍然沒改善這個問題,這是由於,目前有太多程式的運作是依賴這個Bug的特性,因此倘若改的話可能會有更多Bug出現,所以就不要期待這個Bug被修好吧嘿嘿。

Undefined & is not defined ?

字面上來看這兩個應該是相同道理的,但並不是的,這也是容易讓人疑惑的部分,首先Undefined是不會有Error的,而 is not defined是Error給出的訊息。

在Javascript我們看到undefined,事實上並不是真的代表字面上的意思,而是代表著一個 Special Value ,它代表的是變數還沒被設定一個正常值。

https://ithelp.ithome.com.tw/upload/images/20171223/20107670spqgAh0P17.png

而今天如果我們賦予了a一個值。

https://ithelp.ithome.com.tw/upload/images/20171223/201076709M7kvR09e4.png

上面兩個範例我們可以看到,第一個還沒給予正常值的話,大家還記得的話,在Creation phase會創立所有變數到記憶體裡面,並給予一個undefined為初始。

而上面的範例又跟接下來的狀況不太一樣,特別注意到,如果今天我們連變數都沒宣告的話。

https://ithelp.ithome.com.tw/upload/images/20171223/20107670CRvZSjlpec.png

燈愣 ! Error出現了,那是因為在Creation phase的時候它並沒在程式碼找到 var a,因此並沒有替a建立好記憶體空間存放,也就是說a根本不再記憶體內,所以當要在程式碼執行時找到a,就會回傳error,因此我強烈覺得Javascript應該把這個error訊息改成 a is not declared,才不容易造成混淆。

所以undefined並不是真的代表空值或不存在,而應該說是一個非常特別的值,它一樣佔有記憶體空間,實際上代表著這個 special value是被Javascript主動建立的。

知道了這個道理之後,千千萬萬要記得,千萬別做以下這個動作。

https://ithelp.ithome.com.tw/upload/images/20171223/20107670Ir6wsI5nxV.png

事實上這個動作是不會產生Error的,但我們最好讓 undefined這個特殊值永遠代表著一個意思,就是我們,寫程式的人,並沒有替此變數設定一個正常值,也就是說當我們看到undefined就可以知道,阿~這個變數沒有被我們設定到值,這對於debug是非常有幫助的。

想想你如果做了上圖的動作,今天看到undefined,你會無法確定這個undefined到底是我們設定的還是Javascript初始塞入的,所以永遠讓undefined代表著一個意思就好 - 我們只有宣告並沒有設定這個值。

碎碎念

今天的篇幅單單只介紹了Undefined & Null,內容稍嫌短了些,所以我決定 ! 分享一首好歌,佔一下版面刷字數,大家一起刷起來 !

好歌連結

希望大家不會想要一了百了,加油。到這邊就是今天的內容拉,台北持續好天氣,大家持續好心情,有任何錯誤或者不清楚的部分拜偷幫我留建議,謝謝大家。

參考來源

  1. eloquentjavascript
  2. You don't know JS

上一篇
Day03_準備好一起J起來JJJJJJ
下一篇
Day05_Object Types
系列文
那些年,我們一起錯過的Javascript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言