你不知道的JS小黃書(中)

阿狸不歌發表於2017-11-07

“小黃書”是JSer們對《你不知道的JavaScript》(You Don't Know JS)系列的愛稱,就像用“紅寶書”稱呼《JavaScript高階程式設計 》一樣,所以切不可對“小黃書”望文生義,這是一系列很正經的Javascript教科書? 。

enter image description here

圖靈出版的這本《你不知道的JavaScript(中) 》實際上是 You Don't Know JS 系列 第4部 Types & Grammar 與 第5部 Async & Performance 的合集,它們在亞馬遜上的評價都不錯 ——

enter image description here

enter image description here

恰逢參加了圖靈組織的打卡讀書活動,把《你不知道的JavaScript(中)》讀了一遍,領略了一下JS那些可能不為人知的一面。下面是讀書過程中的部分筆記與思考:


型別

JS中的變數是沒有型別的,只有值才有(TypeScript就不一樣了,寫慣了變數有型別的語言,還真有點不適應)。null表示“沒有物件”。undefined表示“缺少值”,而“undefined”和“is not defined”是兩碼事(這就是提示帶來的坑了?)。 undefined 和 undeclared 容易被混為一談,在 JavaScript 中它們是兩碼事。undefined 是值的一種。undeclared 則表示變數還沒有被宣告過。遺憾的是,JavaScript 卻將它們混為一談,在我們試圖訪問 "undeclared" 變數時這樣報錯:ReferenceError: a is not defined,並且 typeof 對 undefined 和 undeclared 變數都返回 "undefined"。

像上面那些東西,可能不少寫過很長時間的JSer也不清楚,我的感覺,在型別和語法這一部分裡,基本上都是在揭示Javascript的各種坑(或者稱之為瑕疵),比如:變數不用宣告就能用,如果某個變數你在某個地方用的時候多敲了一下或者少敲了一下,那這個新敲出來的東西就是一個新的變數,然後嘛,那結果一般就不像預期一樣對了哦,而要找出這個被變化了名字的變數,可能就不是一件容易的事情了。

對於寫慣了強型別語言的人來說,避免上述錯誤的最好方式就是在編譯期做型別檢查,這是強型別語言的編譯器自然而然帶來的,所以我們在使用強型別語言的時候是不會遇到莫名出現某個“未宣告”變數的事情。

有沒有辦法讓JS的變數看上去“像”是有型別的呢?答案當然是選擇TypeScript啦!有了TypeScript提供的編譯期型別檢查,我們再也不用擔心變數寫錯名字、也不會給指定的型別賦上錯誤的值等等……。當然由於要多敲不少型別資訊,所以部分JSer 會覺得有點繁瑣乃至質疑(這樣的事情在JSer的微信群裡是挺常見的,包括我自己剛看到TypeScript的語法時也產生過不適應導致的牴觸情緒)。不過從靜態語言轉而進行 JS 開發的程式設計師一定會對TypeScript感覺到非常親切。總體而言,程式設計師們面對TypeScript的心理,主要還是一個先入為主的習慣問題。

使用TypeScript帶來的另一個好處就是程式碼智慧提示,當我們使用諸如Visual Studio Code這樣的編輯器時,VSC自帶的TypeScript 外掛可以識別出每一個物件的型別,及其有哪些屬性和方法,而呼叫這些方法時,也能智慧匹配出相應的函式,這可以讓我們的開發效率獲得大大的提升。

總而言之,對於很多不知道的JS型別㊙️密,都可以用TypeScript來解決,這是我讀此書型別部分之時產生的強烈感覺。寫程式碼最終的目的是為了生成出有價值的東西,而不是為了炫技,尤其是這門語言並不是由你創造的時候?


Promise

實際上當我最早接觸到Promise、resolve、reject這些詞的時候我是相當困惑? 的,我相信很多JSer都曾經產生過類似的困惑的,主要是很多資料都講不明白這幾個概念,多數就是丟給你一堆程式碼讓你自己去執行體會。

小黃書的Promise章節在一開頭就舉了個買漢堡? 的例子,我覺得寫得很生動,心想當初我要是能早看到這個舉例,那Promise學起來應該會輕鬆很多。當然,為了用我自己理解的語言來表達,我對這個故事進行了重構——

設想一下這樣一個場景:我到某個旅行網站,要買一張機票✈️ 。通過網站下單並付款1000塊?,我已經發出了一個對某個值(就是這張機票? )的請求。我已經啟動了一次交易。

按照目前的機票銷售流程,我不能馬上就得到這張機票。旅行網站會交給我一個帶有訂單號的電子收據。訂單號就是一個 IOU(I owe you,我欠你的)承諾(promise),保證了最終我會得到一個結果。

這個訂單號會保留在旅行平臺的APP上,如果最終沒有出票的話,肯定得給你一個說法,除非你上了一個釣魚? 網站!

在等待的過程中,我可以規劃一下行程,比如住哪個酒店,要去哪些景點遊玩,要買什麼土特產等等……

當然我也可以考慮一下去機場的具體流程。我的大腦之所以可以這麼做,是因為它已經把訂單號當作機票的佔位符了。從本質上講,這個佔位符使得這個值不再依賴時間。這是一個未來值。

終於,旅行網站的APP給我發來提示:您的機票已經出票成功,請帶好身份? 證件,提前兩個小時抵達機場balabala……

換句話說,一旦我需要的機票出好了,通常情況下可以在機票的那個時間去機場,用身份證? 或者是護照取票。也就是,我可以用我的承諾值(value-promise)換取到了這個值(機票)本身(resolve)。

但是,還可能有另一種結果。在少數情況下,航空公司會給我打call ☎️ ,客服滿懷歉意地告訴我:“不好意思,由於特殊原因(比如:目的地發生自然災害、戰爭、政變、罷工……),您的航班已經被迫取消了。”除了作為乘客對這種情況感到憤怒之外,我們還可以看到未來值的一個重要特性:它可能成功,也可能失敗。

每次買機票,我都知道最終要麼可以按計劃旅行(resolve),要麼得到一個不能成行的壞訊息(reject),那我就得找點別的出行方式或者重新制定旅行計劃了。

不過,曾經有一次遇到這種破事的時候,航空公司幫我改簽了另一個航班,並免費升級到頭等艙,這對我來說只能用幸運來形容了?


ps. 據說小黃書中文版下卷在12月就要發售了,期待…… enter image description here

相關文章