在公司做面試官準備的高級前端開發工程師面試題(部分附上參考答案),面試需要刷題,否則你會覺得自己一無所知!

1. vue、react異同點

2. eventLoop原理

3. 防抖和節流 講原理,手寫代碼,逐行講解

function debounce(fn) {

      let timeout = null; // 創建一個標記用來存放定時器的返回值

      return function () {

        clearTimeout(timeout); // 每當用戶輸入的時候把前一個 setTimeout clear 掉

        timeout = setTimeout(() => { // 然後又創建一個新的 setTimeout, 這樣就能保證輸入字符後的 interval 間隔內如果還有字符輸入的話,就不會執行 fn 函數

          fn.apply(this, arguments);

        }, 500);

      };

    }

4. 水平垂直居中的多種方式
5. promise、generator、async、await怎麼使用,有什麼區別
6. 前端性能優化的方法,優先級
7.什麼是變量提升、函數提升?
簡單說就是在js代碼執行前引擎會先進行預編譯,預編譯期間會將變量聲明與函數聲明提升至其對應作用域的最頂端,函數內聲明的變量只會提升至該函數作用域最頂層。
當函數內部定義的一個變量與外部相同時,那麼函數體內的這個變量就會被上升到最頂端;
舉例來說: console.log(a); //
undefined var a = 3;
//預編譯後的代碼結構可以看做如下運行順序 var a; // 將變量a的聲明提升至最頂端,賦值邏輯不提升。 console.log(a);
// undefined a = 3; // 代碼執行到原位置即執行原賦值邏輯
函數提升: 函數提升只會提升函數聲明式寫法,函數表達式的寫法不存在函數提升。
函數提升的優先級大於變量提升的優先級,即函數提升在變量提升之上。
 10. 設計一個select組件,你會做哪些考量  
 12.從瀏覽器輸入url直到頁面渲染,期間有哪些步驟
13.改變this的幾種方式;apply/call/bind 有什麼區別
call,apply,bind的主要作用都是改變this指向的,但使用上略有不同,說一下區別:
call和apply的主要區別是在傳遞參數上不同,call後面傳遞的參數是以逗號的形式分開的,apply傳遞的參數是數組形式(apply是以A開頭,所以這裏可以跟Array有關聯,即參數爲數組)
bind返回的是一個函數形式,如果要執行,則後面要再加一個小括號,例如:bind(obj,參數1,參數2)(),bind只能以逗號分隔形式,不能是數組形式。
14. webpack配置項都有哪些,其中loader和plugin有什麼區別,有沒有看過或者寫過webpack的插件
15. Array都用過什麼方法
16.promise、generator、async/await 有什麼區別
17. 異步有哪些場景,怎麼解決異步
18.localStorage、sessionStorage 區別;應用業務場景
20.ES6+有哪些新特性,介紹一下使用過的特性,經由babel編譯後的代碼是怎樣的;如果讓你實現promise/promise.all/async/await 你會怎麼實現
22.js的構造函數、工廠模式、單例模式、觀察者模式、裝飾器模式
23.選一到兩個你比較滿意或者印象深刻的項目,講講你在其中起到的作用,遇到過什麼比較有挑戰的問題,如何解決
24.vue、react、es6 等等 最近有什麼新進展?
25.vue的觀察者模式,有什麼缺陷嗎,尤雨溪vue3.0打算怎麼優化,或者有什麼其他改進點
28.vue和react對diff算法的優化有哪些;你覺得最新的這些框架和以前jquery相比有什麼優勢
29. fetch,ajax,axios區別?

Fetch 是 ES6中新增了一種HTTP數據請求的方式,默認不帶cookie,如果需要帶需要配置credentials:”include”;fetch請求屬於promise結構,直接.then()方法處理回調數據,如fetch.then(res=>res.json()).then(data=>console.log(data)).catch(e=>log(e));

從 fetch()返回的 Promise 將不會拒絕HTTP錯誤狀態, 即使響應是一個 HTTP 404 或 500。相反,它會正常解決 (其中ok狀態設置爲false), 並且僅在網絡故障時或任何阻止請求完成時,它纔會拒絕。

Ajax 是瀏覽器中創建XMLHttpRequest 創建的異步請求,目前主流瀏覽器都支持; 請求時 狀態400 500的時候會報錯可以catch;

Ajax是基於瀏覽器的XMLHttpRequest的,而fetch是window的一個方法;

axios 是一個基於Promise 用於瀏覽器和 nodejs 的 HTTP 客戶端,本質上也是對原生XHR的封裝,只不過它是Promise的實現版本,符合最新的ES規範,它本身具有以下特徵:
1.從瀏覽器中創建 XMLHttpRequest
2.支持 Promise API
3.客戶端支持防止CSRF
4.提供了一些併發請求的接口(重要,方便了很多的操作)
5.從 node.js 創建 http 請求
6.攔截請求和響應
7.轉換請求和響應數據
8.取消請求
9.自動轉換JSON數據

30.Cros跨域是什麼,能不能避免兩次請求?
Cros跨域資源共享(Cross-Origin Resource Sharing)是一種 AJAX 跨域請求資源的方式,

瀏覽器將CORS請求分成兩類:簡單請求(simple request)和非簡單請求(not-so-simple request)

31.簡單說說js中的繼承?
1.原型鏈繼承 JavaScript實現繼承的基本思想:通過原型將一個引用類型繼承另一個引用類型的屬性和方法。
2.借用構造函數繼承(僞造對象或經典繼承) JavaScript實現繼承的基本思想:在子類構造函數內部調用超類型構造函數。 通過使用apply()和call()方法可以在新創建的子類對象上執行構造函數。
3.組合繼承(原型+借用構造)(僞經典繼承) JavaScript實現繼承的基本思想:將原型鏈和借用構造函數的技術組合在一塊,從而發揮兩者之長的一種繼承模式。
將原型鏈和借用構造函數的技術組合到一起,從而取長補短髮揮兩者長處的一種繼承模式。
4.原型式繼承 JavaScript實現繼承的基本思想:藉助原型可以基於已有的對象創建新對象,同時還不必須因此創建自定義的類型。
5.寄生式繼承 JavaScript實現繼承的基本思想:創建一個僅用於封裝繼承過程的函數,該函數在內部以某種方式來增強對象,最後再像真正是它做了所有工作一樣返回對象。
寄生式繼承是原型式繼承的加強版。
6.寄生組合式繼承 JavaScript實現繼承的基本思想:通過借用函數來繼承屬性,通過原型鏈的混成形式來繼承方法。

 

另附上筆試題:(我覺得手寫算法比較能檢測一個人的實例,其他的都是通過刷題背誦解決的,不能衡量一個人的水平,所以本人偏向用算法考覈,通過手寫算法,可以瞭解一個人的思路,而且通過代碼的書寫,可以看出一個人的代碼命名規範,還有刪除或劃線次數,決定一個人是否邏輯清晰)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章