2019獨角獸企業重金招聘Python工程師標準>>>
摘要:前端的東西特別多,面試的時候我們如何從容應對,作為一個老兵,我在這里分享幾點我的經驗。
一、javascript 基礎(es5)
1、原型:這里可以談很多,只要圍繞 [[ prototype ]] 談,都沒啥問題
2、閉包:牽扯作用域,可以兩者聯系起來一起談
3、作用域:詞法作用域,動態作用域
4、this:不同情況的調用,this 指向分別如何。順帶可以提一下 es6 中箭頭函數沒有 this, arguments, super 等,這些只依賴包含箭頭函數最接近的函數
5、call,apply,bind 三者用法和區別:參數、綁定規則(顯示綁定和強綁定),運行效率(最終都會轉換成一個一個的參數去運行)、運行情況(call,apply 立即執行,bind 是return 出一個 this “固定”的函數,這也是為什么 bind 是強綁定的一個原因)。
6、json jsonp json 數據格式,什么是真正的json,理解跨域的原理,如何解決跨域。
二、JS 基礎(ES6)
-
let,const:let 產生塊級作用域(通常配合 for 循環或者 {} 進行使用產生塊級作用域),const 申明的變量是常量(內存地址不變)
-
Promise:這里你談 promise 的時候,除了將他解決的痛點以及常用的 API 之外,最好進行拓展把 eventloop 帶進來好好講一下,microtask、macrotask 的執行順序,如果看過 promise 源碼,最好可以談一談 原生 Promise 是如何實現的。Promise 的關鍵點在于callback 的兩個參數,一個是 resovle,一個是 reject。還有就是 Promise 的鏈式調用(Promise.then(),每一個 then 都是一個責任人)。
-
Generator:遍歷器對象生成函數,最大的特點是可以交出函數的執行權
-
function
?關鍵字與函數名之間有一個星號; -
函數體內部使用?
yield
?表達式,定義不同的內部狀態; -
next
?指針移向下一個狀態
這里你可以說說?Generator
?的異步編程,以及它的語法糖?async
和?awiat
,傳統的異步編程。ES6 之前,異步編程大致如下
-
回調函數
-
事件監聽
-
發布/訂閱
傳統異步編程方案之一:協程,多個線程互相協作,完成異步任務。
-
async、await:Generator 函數的語法糖。有更好的語義、更好的適用性、返回值是 Promise。
-
async => *
-
await => yield
基本用法
async function timeout (ms) { await new Promise((resolve) => { setTimeout(resolve, ms) })}async function asyncConsole (value, ms) { await timeout(ms) console.log(value)}asyncConsole('hello async and await', 1000)
注:最好把2,3,4 連到一起講
-
AMD,CMD,CommonJs,ES6 Module:解決原始無模塊化的痛點
-
AMD:requirejs 在推廣過程中對模塊定義的規范化產出,提前執行,推崇依賴前置
-
CMD:seajs 在推廣過程中對模塊定義的規范化產出,延遲執行,推崇依賴就近
-
CommonJs:模塊輸出的是一個值的 copy,運行時加載,加載的是一個對象(module.exports 屬性),該對象只有在腳本運行完才會生成
-
ES6 Module:模塊輸出的是一個值的引用,編譯時輸出接口,ES6 模塊不是對象,它對外接口只是一種靜態定義,在代碼靜態解析階段就會生成。
三、框架相關
-
數據雙向綁定原理:常見數據綁定的方案
-
Object.defineProperty(vue):劫持數據的 getter 和 setter
-
臟值檢測(angularjs):通過特定事件進行輪循
-
發布/訂閱模式:通過消息發布并將消息進行訂閱
-
VDOM:三個 part,
-
虛擬節點類,將真實 DOM 節點用 js 對象的形式進行展示,并提供 render 方法,將虛擬節點渲染成真實 DOM
-
節點 diff 比較:對虛擬節點進行 js 層面的計算,并將不同的操作都記錄到 patch 對象
-
re-render:解析 patch 對象,進行 re-render
補充1:VDOM 的必要性?
-
創建真實DOM的代價高:真實的 DOM 節點 node 實現的屬性很多,而 vnode 僅僅實現一些必要的屬性,相比起來,創建一個 vnode 的成本比較低。
-
觸發多次瀏覽器重繪及回流:使用 vnode ,相當于加了一個緩沖,讓一次數據變動所帶來的所有 node 變化,先在 vnode 中進行修改,然后 diff 之后對所有產生差異的節點集中一次對 DOM tree 進行修改,以減少瀏覽器的重繪及回流。
補充2:vue 為什么采用 vdom?
引入 Virtual DOM 在性能方面的考量僅僅是一方面。
性能受場景的影響是非常大的,不同的場景可能造成不同實現方案之間成倍的性能差距,所以依賴細粒度綁定及 Virtual DOM 哪個的性能更好還真不是一個容易下定論的問題。
Vue 之所以引入了 Virtual DOM,更重要的原因是為了解耦 HTML 依賴,這帶來兩個非常重要的好處是:
-
不再依賴 HTML 解析器進行模版解析,可以進行更多的 AOT 工作提高運行時效率:通過模版 AOT 編譯,Vue 的運行時體積可以進一步壓縮,運行時效率可以進一步提升;
-
可以渲染到 DOM 以外的平臺,實現 SSR、同構渲染這些高級特性,Weex 等框架應用的就是這一特性。
綜上,Virtual DOM 在性能上的收益并不是最主要的,更重要的是它使得 Vue 具備了現代框架應有的高級特性。
-
vue 和 react 區別
-
相同點:都支持 ssr,都有 vdom,組件化開發,實現 webComponents 規范,數據驅動等
-
不同點:vue 是雙向數據流(當然為了實現單數據流方便管理組件狀態,vuex 便出現了),react 是單向數據流。vue 的 vdom 是追蹤每個組件的依賴關系,不會渲染整個組件樹,react 每當應該狀態被改變時,全部子組件都會 re-render。
上面提到的每個點,具體細節還得看自己的理解
-
為什么用 vue :簡潔、輕快、舒服、沒了
四、緩存
首先得明確 http 緩存的好處
1、減少了冗余的數據傳輸,減少網費
2、減少服務器端的壓力
3、Web 緩存能夠減少延遲與網絡阻塞,進而減少顯示某個資源所用的時間
4、加快客戶端加載網頁的速度
常見 http 緩存的類型
1、私有緩存(一般為本地瀏覽器緩存)
2、代理緩存
然后談談本地緩存
本地緩存是指瀏覽器請求資源時命中了瀏覽器本地的緩存資源,瀏覽器并不會發送真正的請求給服務器了。它的執行過程是
1、第一次瀏覽器發送請求給服務器時,此時瀏覽器還沒有本地緩存副本,服務器返回資源給瀏覽器,響應碼是200 OK,瀏覽器收到資源后,把資源和對應的響應頭一起緩存下來。
2、第二次瀏覽器準備發送請求給服務器時候,瀏覽器會先檢查上一次服務端返回的響應頭信息中的Cache-Control,它的值是一個相對值,單位為秒,表示資源在客戶端緩存的最大有效期,過期時間為第一次請求的時間減去Cache-Control的值,過期時間跟當前的請求時間比較,如果本地緩存資源沒過期,那么命中緩存,不再請求服務器。
3、如果沒有命中,瀏覽器就會把請求發送給服務器,進入緩存協商階段。
- 更多分享請關注,微信公眾號:xiaohumuhe13,或今日頭條號:(大話前端),還能獲得海量視頻資源哦~
- 我的目標:做最好最全的前端資源分享 ?