話說一週前,我發了這樣一條沸點:javascript
因而我真的就建羣收集了題目,和團隊的同事一塊兒寫答案,咱們也不圖什麼,就是想作一件有意義的事情,如今我整理了下咱們的回答,有的不必定就是很是具體的回答,但也提供了思路和參考資料,你們看看是否還有什麼補充的,或者面試時遇到的問題,也歡迎補充前端
若是是 HTTP 1.0 版本協議,通常狀況下,不支持長鏈接,所以在每次請求發送完畢以後,TCP 鏈接即會斷開,所以一個 TCP 發送一個 HTTP 請求,可是有一種狀況能夠將一條 TCP 鏈接保持在活躍狀態,那就是經過 Connection 和 Keep-Alive 首部,在請求頭帶上 Connection: Keep-Alive,而且能夠經過 Keep-Alive 通用首部中指定的,用逗號分隔的選項調節 keep-alive 的行爲,若是客戶端和服務端都支持,那麼其實也能夠發送多條,不過此方式也有限制,能夠關注《HTTP 權威指南》4.5.5 節對於 Keep-Alive 鏈接的限制和規則。java
而若是是 HTTP 1.1 版本協議,支持了長鏈接,所以只要 TCP 鏈接不斷開,即可以一直髮送 HTTP 請求,持續不斷,沒有上限; 一樣,若是是 HTTP 2.0 版本協議,支持多用複用,一個 TCP 鏈接是能夠併發多個 HTTP 請求的,一樣也是支持長鏈接,所以只要不斷開 TCP 的鏈接,HTTP 請求數也是能夠沒有上限地持續發送android
「Virtual Dom 的優點」其實這道題目面試官更想聽到的答案不是上來就說「直接操做/頻繁操做 DOM 的性能差」,若是 DOM 操做的性能如此不堪,那麼 jQuery 也不至於活到今天。因此面試官更想聽到 VDOM 想解決的問題以及爲何頻繁的 DOM 操做會性能差。ios
首先咱們須要知道:git
DOM 引擎、JS 引擎 相互獨立,但又工做在同一線程(主線程) JS 代碼調用 DOM API 必須 掛起 JS 引擎、轉換傳入參數數據、激活 DOM 引擎,DOM 重繪後再轉換可能有的返回值,最後激活 JS 引擎並繼續執行如有頻繁的 DOM API 調用,且瀏覽器廠商不作「批量處理」優化, 引擎間切換的單位代價將迅速積累若其中有強制重繪的 DOM API 調用,從新計算佈局、從新繪製圖像會引發更大的性能消耗。es6
其次是 VDOM 和真實 DOM 的區別和優化:github
CommonJS 是一種模塊規範,最初被應用於 Nodejs,成爲 Nodejs 的模塊規範。運行在瀏覽器端的 JavaScript 因爲也缺乏相似的規範,在 ES6 出來以前,前端也實現了一套相同的模塊規範 (例如: AMD),用來對前端模塊進行管理。自 ES6 起,引入了一套新的 ES6 Module 規範,在語言標準的層面上實現了模塊功能,並且實現得至關簡單,有望成爲瀏覽器和服務器通用的模塊解決方案。但目前瀏覽器對 ES6 Module 兼容還不太好,咱們平時在 Webpack 中使用的 export 和 import,會通過 Babel 轉換爲 CommonJS 規範。在使用上的差異主要有:web
這道題絕對不是你回答的點越多就越好。這道題考察的是你對瀏覽器緩存知識的理解程度,因此你應該回答的是 Cookie、 Session、Token 的產生背景、原理、有什麼問題,在回答這個的基礎上把差異講出來。把這些東西答出本質,再加點裝逼的東西,再故意拓展講到你準備的其餘內容纔是答好這道題的關鍵,而要理解好這些東西,其實一兩天就夠了。關於 Cookie,最近還發生了 Chrome80 屏蔽第三方 Cookie 的事件,若是真的問到這個問題,講到這件事情妥妥的加分項,前提是你對這件事情也有比較深刻的瞭解。關於 Cookie 和這件事情 我寫了篇文章 github.com/mqyqingfeng… 能夠看一下。面試
圖片格式 | 壓縮方式 | 透明度 | 動畫 | 瀏覽器兼容 | 適應場景 |
---|---|---|---|---|---|
JPEG | 有損壓縮 | 不支持 | 不支持 | 全部 | 複雜顏色及形狀、尤爲是照片 |
GIF | 無損壓縮 | 支持 | 支持 | 全部 | 簡單顏色,動畫 |
PNG | 無損壓縮 | 支持 | 不支持 | 全部 | 須要透明時 |
APNG | 無損壓縮 | 支持 | 支持 | FirefoxSafariiOS Safari | 須要半透明效果的動畫 |
WebP | 有損壓縮 | 支持 | 支持 | ChromeOperaAndroid ChromeAndroid Browser | 複雜顏色及形狀瀏覽器平臺可預知 |
SVG | 無損壓縮 | 支持 | 支持 | 全部(IE8以上) | 簡單圖形,須要良好的放縮體驗須要動態控制圖片特效 |
首屏時間的計算,能夠由 Native WebView 提供的相似 onload 的方法實現,在 ios 下對應的是 webViewDidFinishLoad,在 android 下對應的是onPageFinished事件。
白屏的定義有多種。能夠認爲「沒有任何內容」是白屏,能夠認爲「網絡或服務異常」是白屏,能夠認爲「數據加載中」是白屏,能夠認爲「圖片加載不出來」是白屏。場景不一樣,白屏的計算方式就不相同。
方法1:當頁面的元素數小於x時,則認爲頁面白屏。好比「沒有任何內容」,能夠獲取頁面的DOM節點數,判斷DOM節點數少於某個閾值X,則認爲白屏。 方法2:當頁面出現業務定義的錯誤碼時,則認爲是白屏。好比「網絡或服務異常」。 方法3:當頁面出現業務定義的特徵值時,則認爲是白屏。好比「數據加載中」。
因此當咱們開發一個小程序時,一般會使用 hybrid 的方式,即會根據具體狀況選擇部分功能用小程序原生的代碼來開發,部分功能經過 WebView 加載 H5 頁面來實現。Native 與 Web 渲染混合使用,以實現項目的最優解;
這裏值得注意的是,小程序下,native 方式一般狀況下性能要優於 web 方式。
做爲一道面試題,我以爲重要的是要講出一點其餘人通常不會答出來的深度。像這道題,能夠從原理和解決方案兩個地方做爲答題點,最好在編一個案例。大體講本身遇到過這個問題,因而很好奇深刻研究了一下,發現是浮點數精度致使……原理怎樣怎樣……而後又看了業界的庫的源碼,而後怎樣怎樣解決。
關於原理,我專門寫了一篇文章 github.com/mqyqingfeng… 來解釋,實際回答的時候,我以爲答出來
就已經 OK 了。
再講解決方案,這個能夠直接搜索到,各類方案都瞭解一下,比較一下優劣,還能夠參考業界的一些庫的實現,好比 math.js,不過相關的我並無看過……
若是還有精力的話,能夠從加法再拓展講講超出安全值的數字的計算問題。
因此我以爲一能回答出底層實現,二能回答出多種解決方案的優劣,三能拓展講講 bignum 的處理,就是一個很是不錯的回答了。
在執行一段代碼時,JS 引擎會首先建立一個執行棧
而後JS引擎會建立一個全局執行上下文,並push到執行棧中, 這個過程JS引擎會爲這段代碼中全部變量分配內存並賦一個初始值(undefined),在建立完成後,JS引擎會進入執行階段,這個過程JS引擎會逐行的執行代碼,即爲以前分配好內存的變量逐個賦值(真實值)。
若是這段代碼中存在function的聲明和調用,那麼JS引擎會建立一個函數執行上下文,並push到執行棧中,其建立和執行過程跟全局執行上下文同樣。但有特殊狀況,即當函數中存在對其它函數的調用時,JS引擎會在父函數執行的過程當中,將子函數的全局執行上下文push到執行棧,這也是爲何子函數可以訪問到父函數內所聲明的變量。
還有一種特殊狀況是,在子函數執行的過程當中,父函數已經return了,這種狀況下,JS引擎會將父函數的上下文從執行棧中移除,與此同時,JS引擎會爲還在執行的子函數上下文建立一個閉包,這個閉包裏保存了父函數內聲明的變量及其賦值,子函數仍然可以在其上下文中訪問並使用這邊變量/常量。當子函數執行完畢,JS引擎纔會將子函數的上下文及閉包一併從執行棧中移除。
最後,JS引擎是單線程的,那麼它是如何處理高併發的呢?即當代碼中存在異步調用時JS是如何執行的。好比setTimeout或fetch請求都是non-blocking的,當異步調用代碼觸發時,JS引擎會將須要異步執行的代碼移出調用棧,直到等待到返回結果,JS引擎會當即將與之對應的回調函數push進任務隊列中等待被調用,當調用(執行)棧中已經沒有須要被執行的代碼時,JS引擎會馬上將任務隊列中的回調函數逐個push進調用棧並執行。這個過程咱們也稱之爲事件循環。
附言:須要更深刻的瞭解JS引擎,必須理解幾個概念,執行上下文,閉包,做用域,做用域鏈,以及事件循環。建議去網上多看看相關文章,這裏推薦一篇很是精彩的博客,對於JS引擎的執行作了圖形化的說明,更加便於理解。
tylermcginnis.com/ultimate-gu…
創建了一個「前端校招面試衝刺互助羣」,歡迎加「taoxiaozhao233」 入羣~