摘要:的回調函數執行的優先級要高于,屬于觀察者。的回調函數保存在一個數組中,會將異步回調放到當前幀的末尾回調之前,如果過多,會導致回調不斷延后最后堆積太多。
阿里一面是電話面,問得不多,但是挺有深度。面試官一開始就說,看了你的項目,覺得你基礎挺好的,那我就不問基礎了。然后全程就真的沒有問一個基礎問題。。
1.說說你做的那個網頁版手機QQ項目的難點。我首先想到了滾動條位置無法還原的問題,也就是點擊列表項跳到詳情頁后再返回時,滾動條位置無法還原的bug。我的解決辦法是通過vuex來保存每個組件里的滾動條的位置,然后返回時再滾動到這個位置即可,不過得設置滾動時間為0,不然會有明顯的滾動過程,用戶體驗會很差。
然后又想到了做IP定位時遇到的后臺express服務端無法獲取用戶真實ip地址的問題。其實express是可以獲取用戶真實ip地址的,只是我的nginx沒有寫好配置,導致express獲取到的始終是127.0.0.1本地ip地址。無論怎么獲取,都是這個地址。
解決辦法是修改nginx的配置文件:
location / { proxy_pass http://localhost:8080; # 項目真實地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
重啟nginx: ./nginx -s reload 即可。
然后在express服務端里,通過 req.headers[‘x-real-ip’]即可拿到真實ip地址。然后就可以根據這個ip地址,通過淘寶ip地址庫,定位到用戶的地理位置了。
QQ項目地址:https://github.com/lensh/vue-qq (支持實時群聊、實時私聊、特別關心、屏蔽聊天、IP地位、實時氣溫顯示等QQ核心功能)
還好之前對底層還是有所了解,看過源碼以及一些博客,所以基本答了出來。
Angular的實現: AngularJS 采用“臟值檢測”的方式,數據發生變更后,對于所有的數據和視圖的綁定關系進行一次檢測,識別是否有數據發生了改變,有變化進行處理,可能進一步引發其他數據的改變,所以這個過程可能會循環幾次,一直到不再有數據變化發生后,將變更的數據發送到視圖,更新頁面展現。
只有當改變$scope的值、使用內置的$interval、$timeout的時候,才會進行“臟檢測”。
如果是手動對 ViewModel 的數據進行變更,為確保變更同步到視圖,需要手動觸發一次“臟值檢測”。
Vue的實現:核心就是數據劫持+發布/訂閱模式,VueJS 使用 ES5 提供的 Object.defineProperty() 方法,監控對數據的操作,從而可以自動觸發數據同步。并且,由于是在不同的數據上觸發同步,可以精確的將變更發送給綁定的視圖,而不是對所有的數據都執行一次檢測。
具體實現可參考 https://github.com/lensh/mvvm 。
很多方法:異步加載模塊(代碼分割);提取第三方庫(使用cdn或者vender);代碼壓縮;去除不必要的插件;去除devtool選項等等。
4.看你還寫了一個爬蟲項目,那如果在爬取數據的時候遇到環路了怎么辦,怎樣避免?避免方法也很多:簡單限定爬蟲的最大循環次數,對于某web站點訪問超過一定閾值就跳出,避免無限循環。保存一個已訪問url列表,記錄頁面是否被訪問過的技術。廣度優先的爬行,避免深度優先陷入某個站點的環路中,無法訪問其他站點。
5.React組件性能優化?immutable.js實現原理?使用PureRenderMixin、shouldComponentUpdate來避免不必要的虛擬DOM diff,在render內部優化虛擬DOM的diff速度,以及讓diff結果最小化。使用immutable.js解決復雜數據diff、clone等問題。
immutable.js實現原理:持久化數據結構,也就是使用舊數據創建新數據時,要保證舊數據同時可用且不變。同時為了避免 deepCopy 把所有節點都復制一遍帶來的性能損耗,Immutable 使用了結構共享,即如果對象樹中一個節點發生變化,只修改這個節點和受它影響的父節點,其它節點則進行共享。
明顯是處理異步操作的啊,前者是讓Redux的dispatch方法的參數支持promise,后者是支持函數,而且還是一個異步函數。異步函數里面要dispatch兩次,分別表示異步請求開始和異步請求完成。
7.了解ES8嗎?說說getOwnPropertyDescriptors函數,對象自身屬性描述符有哪些?configurable和enumerable的作用?configurable設置為true后還能刪除該屬性嗎?
之前研究過這個,所以就很容易地回答了出來。該函數返回指定對象(參數)的所有自身屬性描述符。所謂自身屬性描述符就是在對象自身內定義,不是通過原型鏈繼承來的屬性。
屬性描述符:configurable、enumerable、value、writable、get、set。
configurable:當該值為true時,該屬性描述符才能夠被改變,同時該屬性也能從對應的對象上被刪除。默認為 false。
enumerable:當且僅當該屬性的 enumerable 為 true時,該屬性才能夠出現在對象的枚舉屬性中。默認為 false。
Promise.all 把多個promise實例當成一個promise實例,當這些實例的狀態都發生改變時才會返回一個新的promise實例,才會執行then方法。
Promise.race 只要該數組中的 Promise 對象的狀態發生變化(無論是resolve還是reject)該方法都會返回。
利用錨點結合CSS的target偽類就可以了。
10.mod_gzip 和mod_deflate的主要區別是什么?使用哪個更好呢?首先一個區別是安裝它們的Apache Web服務器版本的差異。Apache 1.x系列沒有內建網頁壓縮技術,所以才去用額外的第三方mod_gzip 模塊來執行壓縮。而Apache 2.x官方在開發的時候,就把網頁壓縮考慮進去,內建了mod_deflate 這個模塊,用以取代mod_gzip。雖然兩者都是使用的Gzip壓縮算法,它們的運作原理是類似的。
第二個區別是壓縮質量。mod_deflate 壓縮速度略快而mod_gzip 的壓縮比略高。一般默認情況下,mod_gzip 會比mod_deflate 多出4%~6%的壓縮量。
第三個區別是對服務器資源的占用。 一般來說mod_gzip 對服務器CPU的占用要高一些。mod_deflate 是專門為確保服務器的性能而使用的一個壓縮模塊,mod_deflate 需要較少的資源來壓縮文件。這意味著在高流量的服務器,使用mod_deflate 可能會比mod_gzip 加載速度更快。
spawn函數用給定的命令發布一個子進程,只能運行指定的程序,參數需要在列表中給出。
exec也是一個創建子進程的函數,與spawn函數不同它可以直接接受一個回調函數作為參數,回調函數有三個參數,分別是err, stdout , stderr。
execFile函數與exec函數類似,但execFile函數更顯得精簡,因為它可以直接執行所指定的文件。
fork函數可直接運行Node.js模塊,我們可以直接通過指定模塊路徑而直接進行操作。
process.nextTick()的回調函數執行的優先級要高于setImmediate(),process.nextTick()屬于idle觀察者。
setImmediate()屬check觀察者.在每一輪循環檢查中,idle觀察者先于I/O觀察者,I/O觀察者先于check觀察者。
process.nextTick()的回調函數保存在一個數組中,會將異步回調放到當前幀的末尾、io回調之前,如果nextTick過多,會導致io回調不斷延后,最后callback堆積太多。
setImmediate()的結果則是保存在鏈表中,會將異步回調放到下一幀,不影響io回調,不會造成callback 堆積。
process.nextTick()在每輪循環中會將數組中的回調函數全部執行完,而setImmediate()在每輪循環中執行鏈表中的一個回調函數。
process.nextTick(),效率最高,消費資源小,但會阻塞CPU的后續調用;
setTimeout(),精確度不高,可能有延遲執行的情況發生,且因為動用了紅黑樹,所以消耗資源大;
setImmediate(),消耗的資源小,也不會造成阻塞,但效率也是最低的。
(1)異步流程控制
Express 采用 callback 來處理異步,Koa v1 采用 generator,Koa v2 采用 async/await。
generator 和 async/await 使用同步的寫法來處理異步,明顯好于 callback 和 promise,async/await 在語義化上又要比 generator 更強。
(2)錯誤處理
Express 使用 callback 捕獲異常,對于深層次的異常捕獲不了,Koa 使用 try catch,能更好地解決異常捕獲。
[…new Set([1,2,3,1,’a’,1,’a’])]
15.http2.0的優勢?當時大概地講了一下意思,不過沒答完全。后了又復習了下:
(1)采用二進制格式傳輸數據,而非 http1.1 的文本格式,二進制格式在協議的解析和優化擴展上帶來更多的優勢和可能
(2)對消息頭采用 HPACK 進行壓縮傳輸,能夠節省消息頭占用的網絡的流量,而 http1.1 每次請求,都會攜帶大量冗余頭信息,浪費了很多帶寬資源,頭壓縮能夠很好的解決該問題
(3)多路復用,就是多個請求都是通過一個 TCP 連接并發完成,http1.1 雖然通過pipeline也能并發請求,但是多個請求之間的響應會被阻塞的,所以 pipeline 至今也沒有被普及應用,而 http2.0做到了真正的并發請求,同時,流還支持優先級和流量控制
(4)Server Push,服務端能夠更快的把資源推送給客戶端,例如服務端可以主動把 JS 和 CSS 文件推送給客戶端,而不需要客戶端解析 HTML再發送這些請求,當客戶端需要的時候,它已經在客戶端了。
當時觸發條件只答出了1、2、4、5,而且4只說了inline-block。這種很多情況的一時半會確實很難答完全。。
完整答案:
BFC(塊級格式化上下文),是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面元素,反之亦然。它與普通的塊框類似,但不同之處在于:
(1)可以阻止元素被浮動元素覆蓋。
(2)可以包含浮動元素。
(3)可以阻止margin重疊。
滿足下列條件之一就可觸發BFC:
【1】根元素,即HTML元素
【2】float的值不為none
【3】overflow的值不為visible
【4】display的值為inline-block、table-cell、table-caption
【5】position的值為absolute或fixed
有了Last-Modified,為什么還要用ETag?
(1)因為如果在一秒鐘之內對一個文件進行兩次更改,Last-Modified就會不正確。
(2)某些服務器不能精確的得到文件的最后修改時間。
(3)一些文件也許會周期性的更改,但是他的內容并不改變(僅僅改變的修改時間),這個時候我們并不希望客戶端認為這個文件被修改了,而重新GET。
有了Etag,為什么還要用Last-Modified?
因為有些時候 ETag 可以彌補 Last-Modified 判斷的缺陷,但是也有時候 Last-Modified 可以彌補 ETag 判斷的缺陷,比如一些圖片等靜態文件的修改,如果每次掃描內容生成 ETag 來比較,顯然要比直接比較修改時間慢很多。所有說這兩種判斷是相輔相成的。
ETag的值服務端是對文件的索引節,大小和最后修改時間進行Hash后得到的。
18.你有什么要問的嗎?大概就只記得問了這些,大部分都回答了出來。當然回答時還扯了一些其它的,就不說了。總體來說還是挺有深度的,日后還得繼續努力。
最后,我的github:https://github.com/lensh
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84949.html
摘要:拿到秋招的同學,如確定入職需與用人單位簽署三方協議,以保證雙方的利益不受損失。當然每個崗位所要求的側重點不同,但卻百變不離其宗。方法論要想達成某個目標都有其特定的方法論,學習技術也不例外,掌握適當的學習方法才能事半功倍。 寫在前面的話 筆者從17年的2月份開始準備春招,其中遇到不少坑,也意識到自己走過的彎路。故寫了這篇文章總結一番,本文適合主動學習的,對自己要學的課程不明確的,對面試有...
摘要:拿到秋招的同學,如確定入職需與用人單位簽署三方協議,以保證雙方的利益不受損失。當然每個崗位所要求的側重點不同,但卻百變不離其宗。方法論要想達成某個目標都有其特定的方法論,學習技術也不例外,掌握適當的學習方法才能事半功倍。 寫在前面的話 筆者從17年的2月份開始準備春招,其中遇到不少坑,也意識到自己走過的彎路。故寫了這篇文章總結一番,本文適合主動學習的,對自己要學的課程不明確的,對面試有...
摘要:準備在這里放一些網上比較好的前端面試分享,以后不斷補充。百度阿里網易大疆等大小廠前端校招面筋掘金技術征文地址應屆渣渣前端面經還有游戲策劃以及雞湯地址學前端,我如何一年內學到三年的知識。 準備在這里放一些網上比較好的前端面試分享,以后不斷補充。1、百度阿里網易大疆等大小廠前端校招面筋 | 掘金技術征文地址:https://juejin.im/post/5bb470...2、應屆渣渣前端面...
摘要:準備在這里放一些網上比較好的前端面試分享,以后不斷補充。百度阿里網易大疆等大小廠前端校招面筋掘金技術征文地址應屆渣渣前端面經還有游戲策劃以及雞湯地址學前端,我如何一年內學到三年的知識。 準備在這里放一些網上比較好的前端面試分享,以后不斷補充。1、百度阿里網易大疆等大小廠前端校招面筋 | 掘金技術征文地址:https://juejin.im/post/5bb470...2、應屆渣渣前端面...
閱讀 1647·2021-11-24 09:39
閱讀 3099·2021-11-22 15:24
閱讀 3096·2021-10-26 09:51
閱讀 3285·2021-10-19 11:46
閱讀 2896·2019-08-30 15:44
閱讀 2223·2019-08-29 15:30
閱讀 2541·2019-08-29 15:05
閱讀 778·2019-08-29 10:55