JavaScript的資料型別(4)

江南之一葉發表於2016-10-29

夜深人靜,談談JS中的兩個特殊的原始型別吧,就是null和undefined.

每當談到這兩個特殊的值,總會讓我聯想到宗教和哲學之類的東西,世界上有如此多的程式語言,但JS是唯一讓我有這種感覺的程式語言。

先扯遠一點,茫茫宇宙、廣袤無垠。其中有很多東西是可以被我們看到、聽到、聞到、觸控到、感覺到、感知到的,這樣的東西叫存在,比如動物植物、天空海洋、房屋建築、人的思維(我們的肉眼雖然看不見,但正常人都可以感知到思維和意識的存在)。暗物質呢?我們肉眼也看不見,但科學家們已經證實了它的存在,所有的這些東西,在哲學上叫存在,即一種客觀存在。那麼它的對立面叫what? 答案:前面加一個否定副詞,叫---不存在!這個不存在在JS中就是undefined, 就是英文的原意:『未定義』,但我總覺得這個文縐縐的詞其實不好理解。不如把它理解為不存在更然人明白些。

  • 如果一個函式沒有返回值,其實就是它的返回值為undefined,即它的返回值不存在。
  • 訪問一個物件所沒有的屬性?對不起,得到的是undefined, 即這個屬性不存在。
  • 程式碼中寫了:var a; console.log(a); 得到undefined, 即這個a不存在,你會爭辯:可我明明寫了var a;a在我的程式碼中啊,對的!但這就好比我們人類在這個世界可以把那些沒法證實已經存在的東西專門起個名字--叫『不存在』一樣。你可以提到它,但它真的不存在。它的名字就叫:不存在。

外星人呢?它們存在嗎?---這個問題我個人的回答如下:
(1)這是一個疑問句,不是一個命題。(請複習一下定義。表達判斷的陳述句,叫命題)

(2)你如果說:外星人是存在的。這是一個陳述句,但它的真值目前的科學沒有明顯的證據標明它的真值為true, 即無法確定它的真值,故它也不是一個命題。
(3)你如果說:外星人是不存在的。這也是一個陳述句,但它的真值目前的科學沒有明顯的證據標明它的真值為false, 也無法確定它的真值,故它也不是一個命題。

(4) 第二點和第三點是目前全世界的有關科學家們都想得到答案的一個問題,現在的猜測有很多、傳說有很多、所謂的證據也有很多,但目前為止,沒有一個為大家所共同接受的、明顯的、經過檢驗的證據表明此問題的答案。故我們會繼續研究和等待下去,如果你非要讓我用JS的資料型別來回答,我就說這個問題叫undefined(未定義),哈哈,繞來繞去又繞回來了,是的,所以,我100%的支援JS中保留這個特殊的值:undefined,如果沒有它,這個世界和這門語言將多麼無趣!

再談談null. 很多書上喜歡把程式中的變數比喻成一個盒子,裡面裝的內容就是變數的值。盒子中裝的內容是可以變化的,所以叫變數。這個比喻很形象。先贊一下。

如果你送個你女朋友一個禮物盒,裡面裝得有禮物,用JS的話來說,你給了她一個變數(因為下次你可能用同樣的禮物盒子,但裝另外的禮物),如果你只是給了她一個空盒子,用JS的話來比喻,你給了她一個空值,就是null,裡面什麼也沒有裝(當然你會被她痛扁的),但這個盒子是存在的,不是undefined的。

但這個空盒子的型別是什麼?typeof(null), 返回居然是'object', 它是物件型別?它不是原始型別?它居然是引用型別?有沒有搞錯?是的,但不是我們搞錯了,是JS的設計者搞錯了,但他就是這麼設計的。

現在按照ECMAScript的TC39技術委員會的說法:這是一個不能去修復的錯誤!因為有太多的既有程式碼使用了null.很多人抱怨,我覺得這有啥抱怨的?一個大牛人在短短10天內寫出的語言,現在已經發展到滿世界這麼流行了,此人已經灰常灰常牛了,如果他不犯一點點錯誤,還叫我們這樣智力平平但又靠寫程式碼為生的碼農怎麼混?還要不要我們活了?他犯錯了,說明他是人,不是神!

很多書把null叫做空物件,我個人的意見是你可以這樣理解,但按照Nicholas Zakas這樣全球頂尖JS高手的歸類,它不是引用型別,它應該歸於原始型別,只是它是一種特殊的原始型別,儘管typeof(null)返回'object'. 請不要讓你的Java思維干擾你的JavaScript學習。無數牛人早就說了,Java和JavaScript完全是兩種很不相同的語言。我在開篇也說了,它們之間的關係就是雷鋒和雷鋒塔的關係,即它們之間沒啥關係。完全是2種不同的語言。

因此null === undefined 返回false, 不要用 null == undefined 來判斷。

如果要判斷一個變數x是否為null怎麼辦?簡單,讓它直接和null比較就是了:

console.log(x === null); 看它返回什麼。

宇宙很大,奧妙很多,JavaScript看起很簡單,其實很不簡單,它不是一門玩具語言,而是一門包含哲學、宗教、道法自然的語言,值得你我去細細品味,晚安!

相關文章