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

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

封面

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

Types & Grammar
Async & Performance

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


類型

JS中的變量是沒有類型的,只有值才有(TypeScript就不一樣了,寫慣了變量有類型的語言,還真有點(diǎn)不適應(yīng))。null表示“沒有對象”。undefined表示“缺少值”,而“undefined”和“is not defined”是兩碼事(這就是提示帶來的坑了??)。 undefined 和 undeclared 容易被混為一談,在 JavaScript 中它們是兩碼事。undefined 是值的一種。undeclared 則表示變量還沒有被聲明過。遺憾的是,JavaScript 卻將它們混為一談,在我們試圖訪問 "undeclared" 變量時(shí)這樣報(bào)錯(cuò):ReferenceError: a is not defined,并且 typeof 對 undefined 和 undeclared 變量都返回 "undefined"。

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

對于寫慣了強(qiáng)類型語言的人來說,避免上述錯(cuò)誤的最好方式就是在編譯期做類型檢查,這是強(qiáng)類型語言的編譯器自然而然帶來的,所以我們在使用強(qiáng)類型語言的時(shí)候是不會(huì)遇到莫名出現(xiàn)某個(gè)“未聲明”變量的事情。

有沒有辦法讓JS的變量看上去“像”是有類型的呢?答案當(dāng)然是選擇TypeScript啦!有了TypeScript提供的編譯期類型檢查,我們再也不用擔(dān)心變量寫錯(cuò)名字、也不會(huì)給指定的類型賦上錯(cuò)誤的值等等……。當(dāng)然由于要多敲不少類型信息,所以部分JSer 會(huì)覺得有點(diǎn)繁瑣乃至質(zhì)疑(這樣的事情在JSer的微信群里是挺常見的,包括我自己剛看到TypeScript的語法時(shí)也產(chǎn)生過不適應(yīng)導(dǎo)致的抵觸情緒)。不過從靜態(tài)語言轉(zhuǎn)而進(jìn)行 JS 開發(fā)的程序員一定會(huì)對TypeScript感覺到非常親切。總體而言,程序員們面對TypeScript的心理,主要還是一個(gè)先入為主的習(xí)慣問題。

使用TypeScript帶來的另一個(gè)好處就是代碼智能提示,當(dāng)我們使用諸如Visual Studio Code這樣的編輯器時(shí),VSC自帶的TypeScript 插件可以識(shí)別出每一個(gè)對象的類型,及其有哪些屬性和方法,而調(diào)用這些方法時(shí),也能智能匹配出相應(yīng)的函數(shù),這可以讓我們的開發(fā)效率獲得大大的提升。

總而言之,對于很多不知道的JS類型秘?密,都可以用TypeScript來解決,這是我讀此書類型部分之時(shí)產(chǎn)生的強(qiáng)烈感覺,寫代碼最終的目的是為了生成出有價(jià)值的東西,而不是為了炫技,尤其是這門語言并不是由你創(chuàng)造的時(shí)候???


Promise

實(shí)際上當(dāng)我最早接觸到Promise、resolve、reject這些詞的時(shí)候我是相當(dāng)困惑?? 的,我相信很多JSer都曾經(jīng)產(chǎn)生過類似的困惑的,主要是很多資料都將不明白這幾個(gè)概念,多數(shù)就是丟給你一堆代碼讓你自己去運(yùn)行體會(huì)。

小黃書的Promise在一開頭就舉了個(gè)買漢堡?? 的例子,我覺得寫得很生動(dòng),心想當(dāng)初我要是能早看到這個(gè)舉例,那Promise學(xué)起來應(yīng)該會(huì)輕松很多。當(dāng)然,為了用我自己理解的語言來描述,我對這個(gè)故事進(jìn)行了重構(gòu)——

設(shè)想一下這樣一個(gè)場景:我到某個(gè)旅行網(wǎng)站,要買一張機(jī)票?? 。通過網(wǎng)站下單并付款1000塊??,我已經(jīng)發(fā)出了一個(gè)對某個(gè)值(就是這張機(jī)票?? )的請求。我已經(jīng)啟動(dòng)了一次交易。

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

這個(gè)訂單號(hào)會(huì)保留在旅行平臺(tái)的APP上,如果最終沒有出票的話,肯定得給你一個(gè)說法,除非你上了一個(gè)釣魚?? 網(wǎng)站!

在等待的過程中,我可以規(guī)劃一下行程,比如住哪個(gè)酒店,要去哪些景點(diǎn)游玩,要買什么土特產(chǎn)等等……

當(dāng)然我也可以考慮一下去機(jī)場的具體流程。我的大腦之所以可以這么做,是因?yàn)樗呀?jīng)把訂單號(hào)當(dāng)作機(jī)票的占位符了。從本質(zhì)上講,這個(gè)占位符使得這個(gè)值不再依賴時(shí)間。這是一個(gè)未來值

終于,旅行網(wǎng)站的APP給我發(fā)來提示:您的機(jī)票已經(jīng)出票成功,請帶好身份?? 證件,提前兩個(gè)小時(shí)抵達(dá)機(jī)場balabala……

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

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

每次買機(jī)票,我都知道最終要么可以按計(jì)劃旅行(resolve),要么得到一個(gè)不能成行的壞消息(reject),那我就得找點(diǎn)別的當(dāng)交通方式或者重新制定旅行計(jì)劃了。

當(dāng)然,曾經(jīng)有一次遇到這種破事的時(shí)候,航空公司幫我改簽了另一個(gè)航班,并免費(fèi)升級(jí)到頭等艙,這對我來說只能用幸運(yùn)來形容了??



ps. 據(jù)說小黃書中文版下卷在12月就要發(fā)售了,期待……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容