2018年10月份最新的前端面試題,面試前端多來看看……
10-16
2018年10月份最新的前端面試題,面試前端多來看看……
3 人贊了文章
怎麼去設計一個組件封裝
- 組件封裝的目的是為了重用,提高開發效率和代碼質量
- 低耦合,單一職責,可復用性,可維護性
- 前端組件化設計思路
js 非同步載入的方式
- 渲染引擎遇到 script 標籤會停下來,等到執行完腳本,繼續向下渲染
- defer 是「渲染完再執行」,async 是「下載完就執行」,defer 如果有多個腳本,會按照在頁面中出現的順序載入,多個async 腳本不能保證載入順序
- 載入 es6模塊的時候設置 type=module,非同步載入不會造成阻塞瀏覽器,頁面渲染完再執行,可以同時加上async屬性,非同步執行腳本(利用頂層的this等於undefined這個語法點,可以偵測當前代碼是否在 ES6 模塊之中)
css 動畫和 js 動畫的差異
- 代碼複雜度,js 動畫代碼相對複雜一些
- 動畫運行時,對動畫的控制程度上,js 能夠讓動畫,暫停,取消,終止,css動畫不能添加事件
- 動畫性能看,js 動畫多了一個js 解析的過程,性能不如 css 動畫好
XSS 與 CSRF 兩種跨站攻擊
- xss 跨站腳本攻擊,主要是前端層面的,用戶在輸入層面插入攻擊腳本,改變頁面的顯示,或則竊取網站 cookie,預防方法:不相信用戶的所有操作,對用戶輸入進行一個轉義,不允許 js 對 cookie 的讀寫
- csrf 跨站請求偽造,以你的名義,發送惡意請求,通過 cookie 加參數等形式過濾
- 我們沒法徹底杜絕攻擊,只能提高攻擊門檻
事件委託,目的,功能,寫法
- 把一個或者一組元素的事件委託到它的父層或者更外層元素上
- 優點,減少內存消耗,動態綁定事件
- target 是觸發事件的最具體的元素,currenttarget是綁定事件的元素(在函數中一般等於this)
- JavaScript 事件委託詳解
線程,進程
- 線程是最小的執行單元,進程是最小的資源管理單元
- 一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程
負載均衡
- 當系統面臨大量用戶訪問,負載過高的時候,通常會使用增加伺服器數量來進行橫向擴展,使用集群和負載均衡提高整個系統的處理能力
- 伺服器集群負載均衡原理?
什麼是CDN緩存
- CDN 是一種部署策略,根據不同的地區部署類似nginx 這種服務服務,會緩存靜態資源。前端在項目優化的時候,習慣在講台資源上加上一個 hash 值,每次更新的時候去改變這個 hash,hash 值變化的時候,服務會去重新取資源
- (CDN)是一個經策略性部署的整體系統,包括分散式存儲、負載均衡、網路請求的重定向和內容管理4個要件
- CDN_百度百科
閉包的寫法,閉包的作用,閉包的缺點
- 使用閉包的目的——隱藏變數,間接訪問一個變數,在定義函數的詞法作用域外,調用函數
- 閉包的內存泄露,是IE的一個 bug,閉包使用完成之後,收回不了閉包的引用,導致內存泄露
- 「每日一題」JS 中的閉包是什麼?
- 閉包造成內存泄露的實驗
跨域問題,誰限制的跨域,怎麼解決
- 瀏覽器的同源策略導致了跨域
- 用於隔離潛在惡意文件的重要安全機制
- [jsonp ,允許 script 載入第三方資源]https://segmentfault.com/a/11...
- nginx 反向代理(nginx 服務內部配置 Access-Control-Allow-Origin *)
- cors 前後端協作設置請求頭部,Access-Control-Allow-Origin 等頭部信息
- iframe 嵌套通訊,postmessage
javascript 中常見的內存泄露陷阱
- 內存泄露會導致一系列問題,比如:運行緩慢,崩潰,高延遲
- 內存泄露是指你用不到(訪問不到)的變數,依然占居著內存空間,不能被再次利用起來
- 意外的全局變數,這些都是不會被回收的變數(除非設置 null 或者被重新賦值),特別是那些用來臨時存儲大量信息的變數
- 周期函數一直在運行,處理函數並不會被回收,jq 在移除節點前都會,將事件監聽移除
- js 代碼中有對 DOM 節點的引用,dom 節點被移除的時候,引用還維持
- JavaScript 中 4 種常見的內存泄露陷阱
babel把ES6轉成ES5或者ES3之類的原理是什麼
- 它就是個編譯器,輸入語言是ES6+,編譯目標語言是ES5
- babel 官方工作原理
- 解析:將代碼字元串解析成抽象語法樹
- 變換:對抽象語法樹進行變換操作
- 再建:根據變換後的抽象語法樹再生成代碼字元串
Promise 模擬終止
- 當新對象保持「pending」狀態時,原Promise鏈將會中止執行。
- return new Promise(()=>{}); // 返回「pending」狀態的Promise對象
- 從如何停掉 Promise 鏈說起(promise內存泄漏問題)
promise 放在try catch裡面有什麼結果
- Promise 對象的錯誤具有冒泡性質,會一直向後傳遞,直到被捕獲為止,也即是說,錯誤總會被下一個catch語句捕獲
- 當Promise鏈中拋出一個錯誤時,錯誤信息沿著鏈路向後傳遞,直至被捕獲
網站性能優化
- http 請求方面,減少請求數量,請求體積,對應的做法是,對項目資源進行壓縮,控制項目資源的 dns 解析在2到4個域名,提取公告的樣式,公共的組件,雪碧圖,緩存資源,
- 壓縮資源,提取公共資源壓縮,提取 css ,js 公共方法
- 不要縮放圖片,使用雪碧圖,使用字體圖表(阿里矢量圖庫)
- 使用 CDN,拋開無用的 cookie
- 減少重繪重排,CSS屬性讀寫分離,最好不要用js 修改樣式,dom 離線更新,渲染前指定圖片的大小
- js 代碼層面的優化,減少對字元串的計算,合理使用閉包,首屏的js 資源載入放在最底部
js 自定義事件實現
- 原生提供了3個方法實現自定義事件
- createEvent,設置事件類型,是 html 事件還是 滑鼠事件
- initEvent 初始化事件,事件名稱,是否允許冒泡,是否阻止自定義事件
- dispatchEvent 觸發事件
angular 雙向數據綁定與vue數據的雙向數據綁定
- 二者都是 MVVM 模式開發的典型代表
- angular 是通過臟檢測實現,angular 會將 UI 事件,請求事件,settimeout 這類延遲,的對象放入到事件監測的臟隊列,當數據變化的時候,觸發 $diget 方法進行數據的更新,視圖的渲染
- vue 通過數據屬性的數據劫持和發布訂閱的模式實現,大致可以理解成由3個模塊組成,observer 完成對數據的劫持,compile 完成對模板片段的渲染,watcher 作為橋樑連接二者,訂閱數據變化及更新視圖
get與post 通訊的區別
- Get 請求能緩存,Post 不能
- Post 相對 Get 安全一點點,因為Get 請求都包含在 URL 里,且會被瀏覽器保存歷史紀錄,Post 不會,但是在抓包的情況下都是一樣的。
- Post 可以通過 request body來傳輸比 Get 更多的數據,Get 沒有這個技術
- URL有長度限制,會影響 Get 請求,但是這個長度限制是瀏覽器規定的,不是 RFC 規定的
- Post 支持更多的編碼類型且不對數據類型限制
有沒有去研究webpack的一些原理和機制,怎麼實現的
- 解析webpack配置參數,合併從shell傳入和webpack.config.js文件里配置的參數,生產最後的配置結果。
- 註冊所有配置的插件,好讓插件監聽webpack構建生命周期的事件節點,以做出對應的反應。
- 從配置的entry入口文件開始解析文件構建AST語法樹,找出每個文件所依賴的文件,遞歸下去。
- 在解析文件遞歸的過程中根據文件類型和loader配置找出合適的loader用來對文件進行轉換。
- 遞歸完後得到每個文件的最終結果,根據entry配置生成代碼塊chunk。
- 輸出所有chunk到文件系統。
ES6模塊與CommonJS模塊的差異
- CommonJs 模塊輸出的是一個值的拷貝,ES6模塊輸出的是一個值的引用
- CommonJS 模塊是運行時載入,ES6模塊是編譯時輸出介面
- ES6輸入的模塊變數,只是一個符號鏈接,所以這個變數是只讀的,對它進行重新賦值就會報錯
模塊載入AMD,CMD,CommonJS Modules/2.0 規範
- 這些規範的目的都是為了 JavaScript 的模塊化開發,特別是在瀏覽器端的
- 對於依賴的模塊,AMD 是提前執行,CMD 是延遲執行
- CMD 推崇依賴就近,AMD 推崇依賴前置
Node 事件循環,js 事件循環差異
- Node.js 的事件循環分為6個階段
- 瀏覽器和Node 環境下,microtask 任務隊列的執行時機不同
- Node.js中,microtask 在事件循環的各個階段之間執行
- 瀏覽器端,microtask 在事件循環的 macrotask 執行完之後執行
- 遞歸的調用process.nextTick()會導致I/O starving,官方推薦使用setImmediate()
淺拷貝和深拷貝的問題
- 深拷貝和淺拷貝是只針對Object和Array這樣的複雜類型的
- 也就是說a和b指向了同一塊內存,所以修改其中任意的值,另一個值都會隨之變化,這就是淺拷貝
- 淺拷貝, 」Object.assign() 方法用於將所有可枚舉的屬性的值從一個或多個源對象複製到目標對象。它將返回目標對象
- 深拷貝,JSON.parse()和JSON.stringify()給了我們一個基本的解決辦法。但是函數不能被正確處理
開放性問題
開放性問題主要是考察候選人業務積累,是否有自己的思考,思考問題的方式,沒有標準答案。不過有些問題挺刁的,哈哈哈哈,比如:" 你見過的最好的代碼是什麼? "總之提前準備下沒錯。
- 先自我介紹一下,說一下項目的技術棧,以及項目中遇到的一些問題
- 從整體中,看你對項目的認識,框架的認識和自己思考
- 項目中有沒有遇到什麼難點,怎麼解決
- 如果你在創業公司你怎麼從0開始做(選擇什麼框架,選擇什麼構建工具)
- 說一下你項目中用到的技術棧,以及覺得得意和出色的點,以及讓你頭疼的點,怎麼解決的
- 一個業務場景,面對產品不斷迭代,以及需求的變動該怎麼應對,具體技術方案實現
- 你的學習來源是什麼
- 你覺得哪個框架比較好,好在哪裡
- 你覺得最難得技術難點是什麼
- 你見過的最好的代碼是什麼
推薦閱讀: