本文適合最近在考慮新機會的的小伙伴閱讀
歡迎關(guān)注前端早茶,與廣東靚仔攜手共同進階~
作者:廣東靚仔
一、前言
?這套題目是某位群友親身經(jīng)歷過的,感謝小伙伴share~

這套題目,考得比較實用也還挺全面,下面我們來看看具體的內(nèi)容。二、原題
講講事件循環(huán)
JavaScript 是一門單線程語言,異步操作都是放到事件循環(huán)隊列里面,等待主執(zhí)行棧來執(zhí)行的,并沒有專門的異步執(zhí)行線程。所謂單線程,無非就是同步隊列和異步隊列,js代碼是自上向下執(zhí)行的,在主線程中立即執(zhí)行的就是同步任務(wù),比如簡單的邏輯操作及函數(shù),而異步任務(wù)不會立馬立馬執(zhí)行,會挪步放到到異步隊列中,比如ajax、promise、事件、計時器等等。
也就是先執(zhí)行同步,主線程結(jié)束后再按照異步的順序再次執(zhí)行。
事件循環(huán)意思就是:等待主線程中任務(wù)全部完成后,再回來把異步隊列中任務(wù)放到主程序中運行,這樣反復(fù)的循環(huán)
三、宏觀任務(wù)和微觀任務(wù)(先執(zhí)行微觀任務(wù),再執(zhí)行宏觀任務(wù)):在事件循環(huán)中,每進行一次循環(huán)操作稱為tick,tick 的任務(wù)處理模型是比較復(fù)雜的,里邊有兩個詞:分別是 Macro Task (宏任務(wù))和 Micro Task(微任務(wù))。
宏觀任務(wù)主要包含:setTimeout、setInterval、script(整體代碼)、I/O、UI 交互事件、setImmediate(Node.js 環(huán)境)微觀任務(wù)主要包括:Promise、MutaionObserver、process.nextTick(Node.js 環(huán)境)規(guī)范:先執(zhí)行微觀任務(wù),再執(zhí)行宏觀任務(wù)(microtask 優(yōu)先于 task 執(zhí)行,所以如果有需要優(yōu)先執(zhí)行的邏輯,放入microtask 隊列會比 task 更早的被執(zhí)行。)事件委托
JS中當(dāng)出發(fā)某些具有冒泡性質(zhì)的事件是,首先在觸發(fā)元素尋找是否有相應(yīng)的注冊事件,如果沒有再繼續(xù)向上級父元素尋找是否有相應(yīng)的注冊事件作出相應(yīng),這就是事件冒泡。利用事件冒泡的特性,將本應(yīng)該注冊在子元素上的處理事件注冊在父元素上,這樣點擊子元素時發(fā)現(xiàn)其本身沒有相應(yīng)事件就到父元素上尋找作出相應(yīng)。2.隨時可以添加子元素,添加的子元素會自動有相應(yīng)的處理事件。適合用事件委托的事件:click,mousedown,mouseup,keydown,keyup,keypress。Tips: mouseover和mouseout雖然也有事件冒泡,但是處理它們的時候需要特別的注意,因為需要經(jīng)常計算它們的位置,處理起來不太容易。sass和less的區(qū)別
sass和less都是css的預(yù)編譯處理語言,他們引入了mixins,參數(shù),嵌套規(guī)則,運算,顏色,名字空間,作用域,JavaScript賦值等 加快了css開發(fā)效率,
當(dāng)然這兩者都可以配合gulp和grunt等前端構(gòu)建工具使用sass的安裝需要Ruby環(huán)境的,是在服務(wù)端上處理的,而Less是需要引入less.js來處理Less代碼輸出css到瀏覽器,也可以在開發(fā)環(huán)節(jié)使用Less,然后編譯成css文件,直接放到項目中。
Less是@,而Scss是$
Sass提供4中輸出選項:nested, compact, compressed 和 expanded.
4.Sass支持條件語句,可以使用if{}else{},for{}循環(huán)等等。而Less不支持。scss引用的外部文件命名必須以開頭, 文件名如果以下劃線開頭的話,Sass會認為該文件是一個引用文件,不會將其編譯為css文件.
Sass有工具庫Compass
Less有UI組件庫Bootstrap
http的狀態(tài)碼、http緩存
狀態(tài)碼分為5類:
| 1** | 信息,服務(wù)器收到請求,需要請求者繼續(xù)執(zhí)行操作 |
| 2** | 成功,操作被成功接收并處理 |
| 3** | 重定向,需要進一步的操作以完成請求 |
| 4** | 客戶端錯誤,請求包含語法錯誤或無法完成請求 |
| 5** | 服務(wù)器錯誤,服務(wù)器在處理請求的過程中發(fā)生了錯誤 |
301:
(永久移動)請求的網(wǎng)頁已被永久移動到新位置。服務(wù)器返回此響應(yīng)(作為對GET或HEAD請求的響應(yīng))時,會自動將請求者轉(zhuǎn)到新位置。302:
(臨時移動)服務(wù)器目前正從不同位置的網(wǎng)頁響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來進行以后的請求。此代碼與響應(yīng)GET和HEAD請求的301代碼類似,會自動將請求者轉(zhuǎn)到不同的位置。304:
響應(yīng)禁止包含消息體,如果客戶端發(fā)送了一個帶條件的 GET 請求且該請求已被允許,而文檔的內(nèi)容(自上次訪問以來或者根據(jù)請求的條件)并沒有改變,則服務(wù)器應(yīng)當(dāng)返回這個狀態(tài)碼。305:被請求的資源必須通過指定的代理才能被訪問。
400:
語義有誤,當(dāng)前請求無法被服務(wù)器理解。除非進行修改,否則客戶端不應(yīng)該重復(fù)提交這個請求,或者請求參數(shù)有誤。403:服務(wù)器已經(jīng)理解請求,但是拒絕執(zhí)行它。
404:請求失敗,請求所希望得到的資源未被在服務(wù)器上發(fā)現(xiàn)。
500:
服務(wù)器遇到了一個未曾預(yù)料的狀況,導(dǎo)致了它無法完成對請求的處理。一般來說,這個問題都會在服務(wù)器端的源代碼出現(xiàn)錯誤時出現(xiàn)。
http緩存請求相應(yīng)頭:
請求/響應(yīng)頭,緩存控制字段,可以說是控制http緩存的最高指令,要不要緩存也是它說了算。 1.1 no-store:所有內(nèi)容都不緩存 1.2 no-cache:緩存,但是瀏覽器使用緩存前,都會請求服務(wù)器判斷緩存資源是否是最新,它是個比較高貴的存在,因為它只用不過期的緩存。 1.3 ?max-age=x(單位秒) 請求緩存后的X秒不再發(fā)起請求,屬于http1.1屬性,與下方Expires(http1.0屬性)類似,但優(yōu)先級要比Expires高。 1.4 s-maxage=x(單位秒) 代理服務(wù)器請求源站緩存后的X秒不再發(fā)起請求,只對CDN緩存有效(這個在后面會細說) 1.5 public 客戶端和代理服務(wù)器(CDN)都可緩存2.Expires 響應(yīng)頭,代表資源過期時間,由服務(wù)器返回提供,GMT格式日期,是http1.0的屬性,在與max-age(http1.1)共存的情況下,優(yōu)先級要低。3.Last-Modified 響應(yīng)頭,資源最新修改時間,由服務(wù)器告訴瀏覽器。4.if-Modified-Since 請求頭,資源最新修改時間,由瀏覽器告訴服務(wù)器(其實就是上次服務(wù)器給的Last-Modified,請求又還給服務(wù)器對比),和Last-Modified是一對,它兩會進行對比。5.Etag 響應(yīng)頭,資源標(biāo)識,由服務(wù)器告訴瀏覽器。6.if-None-Match 請求頭,緩存資源標(biāo)識,由瀏覽器告訴服務(wù)器(其實就是上次服務(wù)器給的Etag),和Etag是一對,它兩會進行對比。
http緩存方案
不推薦緩存html文件,這樣每次html加載渲染都可以感知文件變化,反正文件沒變還是使用本地緩存,文件名都變了說明修改過,重新請求緩存就好了。
1.CDN通過分流的形式,大大減輕源站的訪問壓力。2.CDN也解決了跨地區(qū)訪問問題,根本上為訪問提供了加速。了解了上面不同瀏覽器行為對http緩存的不同影響,理解強緩存與協(xié)商性緩存就很容易了。
不發(fā)起http請求,直接使用本地緩存,比如瀏覽器地址欄回車,使用瀏覽器的刷新按鈕,在Expires或max-age生效的情況下,觸發(fā)的都是強緩存。
在使用本地緩存前,先與服務(wù)器協(xié)商,核對緩存文件是否為最新。比如設(shè)置了cache-control=no-cache,不管你做任何操作,都會發(fā)起請求,這一類就是協(xié)商性緩存了。
css盒模型
1. 基本概念:
? ? 標(biāo)準模型和IE模型/*?標(biāo)準模型?*/
box-sizing:content-box;
?/*IE模型*/
box-sizing:border-box;
根據(jù)盒模型解釋邊距重疊:父元素沒有設(shè)置margin-top,而子元素設(shè)置了margin-top:20px;可以看出,父元素也一起有了邊距。BFC(block formatting context)塊級格式化上下文
(1). 內(nèi)部的box會在垂直方向上,一個接一個地放
(2). 每個元素的margin box的左邊,與包含塊border box的左邊相接觸(對于從做往右的格式化,否則相反)
(3). box垂直方向的距離由margin決定,屬于同一個bfc的兩個相鄰box的margin會發(fā)生重疊
(4). bfc的區(qū)域不會與浮動區(qū)域的box重疊
(5). bfc是一個頁面上的獨立的容器,外面的元素不會影響bfc里的元素,反過來,里面的也不會影響外面的
(6). 計算bfc高度的時候,浮動元素也會參與計算
1. 脫離文檔流(float不為none時)
2.position為absolute或fixed
3. display 為inline-block、table-cell、table-caption、flex、inline-flex。
4. overflow不為visible
5. 根元素。
1. 自適應(yīng)兩欄布局
2. 清除內(nèi)部浮動
3. 防止垂直margin重疊
小程序分包機制
微信小程序采用的是類似離線包加載方案,用戶第一次打開時會先下載好所有代碼,然后再加載頁面;當(dāng)用戶再次進入時,會直接使用已下載的代碼,省去了代碼下載的過程,打開速度更快。
第一次打開小程序時白屏?xí)r間很長,因為要先下載好所有的代碼,代碼越多,白屏?xí)r間越長
代碼有部分更新時,沒辦法進行增量更新,每次發(fā)版用戶都需要重新下載全部代碼離線包和M頁的一種結(jié)合機制,即把代碼劃分成主包+N個分包
好處:進入主包頁面時,需要下載的代碼量小了很多,白屏?xí)r間更短,體驗更佳目錄
├──?app.js
├──?app.json
├──?app.wxss
├──?packageA
│???└──?pages
│???????├──?cat
│???????└──?dog
├──?packageB
│???└──?pages
│???????├──?apple
│???????└──?banana
├──?pages
│???├──?index
│???└──?logs
└──?utils
?
app.json?
subpackages 字段聲明項目分包結(jié)構(gòu):
{
??"pages":[
????"pages/index",
????"pages/logs"
??],
"subpackages":?[
??{
????"root":?"packageA",
????"pages":?[
??????"pages/cat",
??????"pages/dog"
????]
??},?{
????"root":?"packageB",
????"name":?"pack2",
????"pages":?[
??????"pages/apple",
??????"pages/banana"
????]
??}
??]
}
subpackages 中,每個分包的配置有以下幾項:
字段類型說明rootString分包根目錄nameString分包別名,分包預(yù)下載時可以使用pagesStringArray分包頁面路徑,相對與分包根目錄independentBoolean分包是否是獨立分包
打包原則
聲明 subpackages 后,將按 subpackages 配置路徑進行打包,subpackages 配置路徑外的目錄將被打包到 app(主包) 中app(主包)也可以有自己的 pages(即最外層的 pages 字段)
subpackage 的根目錄不能是另外一個 subpackage 內(nèi)的子目錄
tabBar 頁面必須在 app(主包)內(nèi)
引用原則
packageA 無法 require packageB JS 文件,但可以 require app、自己 package 內(nèi)的 JS 文件packageA 無法 import packageB 的 template,但可以 require app、自己 package 內(nèi)的 template
packageA 無法使用 packageB 的資源,但可以使用 app、自己 package 內(nèi)的資源
js的基本數(shù)據(jù)類型和引用類型
字符串(String)、數(shù)字(Number)、布爾(Boolean)、對空(Null)、未定義(Undefined)、Symbol。對象(Object)、數(shù)組(Array)、函數(shù)(Function)。說說js緩存
緩存的好處:
(1).當(dāng)頁面渲染的數(shù)據(jù)過多時,為了減輕對內(nèi)存的占用,對初次接收且會用到的數(shù)據(jù)進行本地緩存,是有著大好處的.(2).受網(wǎng)速等各種因素的影響,當(dāng)渲染數(shù)據(jù)過多時,若存在頻繁的切換頁面,用戶體驗效果不佳。本地存儲
storage來對數(shù)據(jù)進行存儲(sessionStorage、localStorage)sessionStorage
臨時的會話存儲,只要當(dāng)前的會話窗口未關(guān)閉,存儲的信息就不會丟失,即便刷新了頁面或者在編輯器中更改了代碼,存儲的會話信息也不會丟失。localStorage
不主動去清除,會一直將數(shù)據(jù)存儲在客戶端的儲存方式,即使關(guān)閉了瀏覽器,下次打開的時候仍然可以看到之前存儲的未主動清除的數(shù)據(jù)(即便是殺毒軟件或者瀏覽器自帶的清除功能,也不能將localStorage存儲的數(shù)據(jù)清除掉)storage存儲的數(shù)據(jù)只能是字符串類型,其他類型的數(shù)據(jù)需做類型轉(zhuǎn)換cookie
cookie屬于較老且最常見用的最多的技術(shù)了,cookie的優(yōu)點很多,用起來也比較方便cookie缺陷:4kb,cookie本地存儲的數(shù)據(jù)會被發(fā)送到服務(wù)器cookie和storage的區(qū)別
1.cookie兼容所有的瀏覽器(本地cookie谷歌不支持),storage不支持IE6~8;2.二者對存儲的內(nèi)容均有大小限制,前者同源情況寫一般不能存儲4kb的內(nèi)容,后者同源一般能存儲只能存儲5MB的數(shù)據(jù)3.cookie有過期時間,localStorage是永久存儲(如果你不手動去刪除的話)4.一些瀏覽器處于安全的角度可能會禁用cookie,但無法禁用localStoragejquery的ajax實現(xiàn)原理
1.jQuery底層在實現(xiàn)ajax功能時,調(diào)用了瀏覽器中的XMLHttpRequest對象,在最新的2.0版本后,由于不考慮IE瀏覽器的支持,直接使用該對象獲取用戶請求的數(shù)據(jù),包括地址和參數(shù)等。2.它將對象打開請求地址時的相關(guān)參數(shù)封裝在相關(guān)函數(shù)如ajax()的配置項中,一旦傳入了必需選項,則直接調(diào)用相應(yīng)的send()方法進行數(shù)據(jù)的請求。3.jQuery底層將對象請求后返回的數(shù)據(jù)結(jié)果,直接封裝到相關(guān)函數(shù)的success方法中,所以,一旦異步請求成功,返回的數(shù)據(jù)對象直接注入到方法中,因此,可以調(diào)用success方法獲取服務(wù)端返回的數(shù)據(jù)。1、ajax和jsonp這兩種技術(shù)在調(diào)用方式上“看起來”很像,目的也一樣,都是請求一個url,然后把服務(wù)器返回的數(shù)據(jù)進行處理,因此jquery和ext等框架都把jsonp作為ajax的一種形式進行了封裝;