你所不知道的JavaScript(三)

charliemei發表於2018-03-15

第五章 語法

{…}一個程式碼塊會返回最後一個語句的結果值,可以用eval()去獲得(不建議),{}在不同情況下意思不同,可以是語句塊、物件常量、解構賦值或者命名函式引數,在程式碼塊中有一個坑,{}+[]//0,{}是一個空執行塊(不執行任何操作),最後+[]將[]強制型別轉換為0。[]+{}//”[object object]”。Switch中的判斷是一個嚴格相等的判斷,這個一不注意就會出錯。 在“&&”和“||”的判斷中,前者的優先順序高於後者的優先順序,而且a&&b裡,若a為假值,會返回a的值而不會再往下判斷,而a||b裡,若a為真值,會返回a的值而不會再往下判斷。

第二部分 非同步與效能

第一章 非同步:現在與未來

JS是一門非同步單執行緒語言,這是為了在使用者互動時不會出現假死情況,優化使用者體驗。沒有了並行就少了很多繁瑣的狀態,而利用非同步程式設計模擬併發又可以讓js效率提高,js有現在執行的函式,也有未來執行的函式。js的非同步函式不會馬上執行,而是先註冊監聽,等到事件觸發了,就將這個回撥函式壓入事件佇列中,等待順序執行的任務佇列空了以後,再執行事件佇列中的函式。

第二章 回撥

我們人類的大腦都適應了順序的做每一個動作,所以可以看做類似於單執行緒執行的事件迴圈佇列,就像js引擎一樣。由於非同步程式設計,一不小心js就容易形成回撥地獄,而且回撥中缺乏順序性和可信任性容易造成控制反轉,回撥函式是js非同步的基本單元,可是隨著業務的發展和推進,複雜度越來越高,因此需要一種更同步、更順序、更阻塞的方式來表達非同步。

第三章 Promise

Promise提供了一種解決方式去處理現在值和未來值,每次執行promise的返回值都是一個promise物件,這樣就意味著我們可以鏈式去呼叫,它有三種狀態,狀態只能改變一次,之後就不能再改變。Promise有三種狀態決議,完成和拒絕,Promise物件可以傳入兩個引數resolve和reject,分別會呼叫兩個函式,決議和拒絕函式。

第四章 生成器

在es6中提出了生成器generator的概念,這意味著程式碼可以在執行期間被暫停,然後等待命令繼續往下執行,這種交替的暫停和恢復是合作性的而不是搶佔性的。Function *foo(){},這就是一個生成器的宣告,在函式裡如果碰到了yield就會暫停執行,然後我們可以用next()去命令它往下執行,其中還能傳引數,引數由對應位置的yield接收,而要啟動生成器,我們首先得執行一次next()第一個next傳任何引數都會被預設視為undefined,next()還包含了一個value屬性,儲存的是下一個位置的yield的值。生成器的優點就在於其內部的程式碼以自然的同步(順序)方式表達任務的一系列步驟,為非同步程式碼保持了順序、同步、阻塞的程式碼模式。

相關文章