前端面試題(3)現代技術

什麼是單頁面應用(SPA)?javascript

  • 單頁面應用(SPA)是指用戶在瀏覽器加載單一的HTML頁面,後續請求都無需再離開此頁
  • 目標:旨在用爲用戶提供了更接近本地移動APP或桌面應用程序的體驗。
  • 流程:第一次請求時,將導航頁傳輸到客戶端,其他請求經過 REST API 獲取 JSON 數據
  • 實現:數據的傳輸經過 Web Socket API 或 RPC(遠程過程調用)。
  • 優勢:用戶體驗流暢,服務器壓力小,先後端職責分離
  • 缺點:關鍵詞佈局難度加大,不利於 SEO

什麼是「前端路由」? 何時適用「前端路由」? 有哪些優勢和缺點?css

  • 前端路由經過 URL 和 History 來實現頁面切換
  • 應用:前端路由主要適用於「先後端分離」的單頁面應用(SPA)項目
  • 優勢:用戶體驗好,交互流暢
  • 缺點:瀏覽器「前進」、「後退」會從新請求,沒法合理利用緩存

模塊化開發怎麼作?前端

  • 封裝對象做爲命名空間 -- 內部狀態能夠被外部改寫
  • 當即執行函數(IIFE) -- 須要依賴多個JS文件,而且嚴格按順序加載
  • 使用模塊加載器 -- require.js, sea.js, EC6 模塊

通行的 Javascript 模塊的規範有哪些?java

  • CommonJS -- 主要用在服務器端 node.js
var math = require('./math');
math.add(2,3);
  • AMD(異步模塊定義) -- require.js
require(['./math'], function (math) {
    math.add(2, 3);
});
  • CMD(通用模塊定義) -- sea.js
var math = require('./math');
math.add(2,3);
  • ES6 模塊
import {math} from './math';
math.add(2, 3);

AMD 與 CMD 規範的區別?node

  • 規範化產出:react

    • AMD 由 RequireJS 推廣產出
    • CMD 由 SeaJS 推廣產出
  • 模塊的依賴:jquery

    • AMD 提早執行,推崇依賴前置
    • CMD 延遲執行,推崇依賴就近
  • API 功能:webpack

    • AMD 的 API 默認多功能(分全局 require 和局部 require)
    • CMD 的 API 推崇職責單一純粹(沒有全局 require)
    • 模塊定義規則:web

      • AMD 默認一開始就載入所有依賴模塊
define(['./a', './b'], function(a, b) {
      a.doSomething();
      b.doSomething();
  });
  • CMD 依賴模塊在用到時才就近載入
define(function(require, exports, module) {
      var a = require('./a');
      a.doSomething();
      var b = require('./b');
      b.doSomething();
  })

requireJS的核心原理是什麼?面試

  • 每一個模塊所依賴模塊都會比本模塊預先加載

對 Node.js 的優勢、缺點提出了本身的見解? Node.js的特色和適用場景?

  • Node.js的特色:單線程,非阻塞I/O,事件驅動
  • Node.js的優勢:擅長處理高併發;適合I/O密集型應用
  • Node.js的缺點:不適合CPU密集運算;不能充分利用多核CPU;可靠性低,某個環節出錯會致使整個系統崩潰

    • Node.js的適用場景:

      • RESTful API
      • 實時應用:在線聊天、圖文直播
      • 工具類應用:前端部署(npm, gulp)
      • 表單收集:問卷系統

如何判斷當前腳本運行在瀏覽器仍是node環境中?

  • 判斷 Global 對象是否爲 window,若是不爲 window,當前腳本沒有運行在瀏覽器中

什麼是 npm ?

  • npm 是 Node.js 的模塊管理和發佈工具

什麼是函數式編程?

  • 函數式編程是一種"編程範式",主要思想是把運算過程儘可能寫成一系列嵌套的函數調用
  • 例如:var result = subtract(multiply(add(1,2), 3), 4);
  • 函數式編程的特色:

    • 函數核心化:函數能夠做爲變量的賦值、另外一函數的參數、另外一函數的返回值
    • 只用「表達式」,不用「語句」:要求每一步都是單純的運算,都必須有返回值
    • 沒有"反作用":全部功能只爲返回一個新的值,不修改外部變量
    • 引用透明:運行不依賴於外部變量,只依賴於輸入的參數
  • 函數式編程的優勢:

    • 代碼簡潔,接近天然語言,易於理解
    • 便於維護,利於測試、除錯、組合
    • 易於「併發編程「,不用擔憂一個線程的數據,被另外一個線程修改
    • 可「熱升級」代碼,在運行狀態下直接升級代碼,不須要重啓,也不須要停機

什麼是函數柯里化Currying)?

  • 柯里化:

    • 一般也稱部分求值,含義是給函數分步傳遞參數,每次遞參部分應用參數,並返回一個更具體的函數,繼續接受剩餘參數
    • 期間會連續返回具體函數,直至返回最後結果。所以,函數柯里化是逐步傳參,逐步縮小函數的適用範圍,逐步求解的過程
    • 柯里化的做用:延遲計算;參數複用;動態建立函數
  • 柯里化的缺點:

    • 函數柯里化會產生開銷(函數嵌套,比普通函數佔更多內存),但性能瓶頸首先來自其它緣由(DOM 操做等)

什麼是依賴注入?

  • 當一個類的實例依賴另外一個類的實例時,本身不建立該實例,由IOC容器建立並注入給本身,所以稱爲依賴注入。
  • 依賴注入解決的就是如何有效組織代碼依賴模塊的問題

設計模式:什麼是 singleton, factory, strategy, decorator?

  • Singleton(單例) 一個類只有惟一實例,這個實例在整個程序中有一個全局的訪問點
  • Factory (工廠) 解決實列化對象產生重複的問題
  • Strategy(策略) 將每個算法封裝起來,使它們還能夠相互替換,讓算法獨立於使用
  • Observer(觀察者) 多個觀察者同時監聽一個主體,當主體對象發生改變時,全部觀察者都將獲得通知
  • Prototype(原型) 一個徹底初始化的實例,用於拷貝或者克隆
  • Adapter(適配器) 將不一樣類的接口進行匹配調整,儘管內部接口不兼容,不一樣的類仍是能夠協同工做
  • Proxy(代理模式) 一個充當過濾轉發的對象用來表明一個真實的對象
  • Iterator(迭代器) 在不須要直到集合內部工做原理的狀況下,順序訪問一個集合裏面的元素
  • Chain of Responsibility(職責連) 處理請求組成的對象一條鏈,請求鏈中傳遞,直到有對象能夠處理

什麼是前端工程化?

  • 前端工程化就是把一整套前端工做流程使用工具自動化完成
  • 前端開發基本流程:

    • 項目初始化:yeoman, FIS
    • 引入依賴包:bower, npm
    • 模塊化管理:npm, browserify, Webpack
    • 代碼編譯:babel, sass, less
    • 代碼優化(壓縮/合併):Gulp, Grunt
    • 代碼檢查:JSHint, ESLint
    • 代碼測試:Mocha
  • 目前最知名的構建工具:Gulp, Grunt, npm + Webpack

介紹 Yeoman 是什麼?

  • Yeoman --前端開發腳手架工具,自動將最佳實踐和工具整合起來構建項目骨架
  • Yeoman 實際上是三類工具的合體,三類工具各自獨立:

    • yo --- 腳手架,自動生成工具(至關於一個粘合劑,把 Yeoman 工具粘合在一塊兒)
    • Grunt、gulp --- 自動化構建工具 (最初只有grunt,以後加入了gulp)
    • Bower、npm --- 包管理工具 (原來是bower,以後加入了npm)

介紹 WebPack 是什麼? 有什麼優點?

  • WebPack 是一款[模塊加載器]兼[打包工具],用於把各類靜態資源(js/css/image等)做爲模塊來使用
  • WebPack 的優點:

    • WebPack 同時支持 commonJS 和 AMD/CMD,方便代碼遷移
    • 不只僅能被模塊化 JS ,還包括 CSS、Image 等
    • 能替代部分 grunt/gulp 的工做,如打包、壓縮混淆、圖片base64
    • 擴展性強,插件機制完善,特別是支持 React 熱插拔的功能

介紹類庫和框架的區別?

  • 類庫是一些函數的集合,幫助開發者寫WEB應用,起主導做用的是開發者的代碼
  • 框架是已實現的特殊WEB應用,開發者只需對它填充具體的業務邏輯,起主導做用是框架

什麼是 MVC/MVP/MVVM/Flux?

  • MVC(Model-View-Controller)

    • V->C, C->M, M->V
    • 通訊都是單向的;C只起路由做用,業務邏輯都部署在V
    • Backbone
  • MVP(Model-View-Presenter)

    • V<->P, P<->M
    • 通訊都是雙向的;V和M不發生聯繫(經過P傳);V很是薄,邏輯都部署在P
    • Riot.js
  • MVVM(Model-View-ViewModel)

    • V->VM, VM<->M
    • 採用雙向數據綁定:View 和 ViewModel 的變更都會相互映射到對象上面
    • Angular
  • Flux(Dispatcher-Store-View)

    • Action->Dispatcher->Store->View, View->Action
    • Facebook 爲了解決在 MVC 應用中碰到的工程性問題提出一個架構思想
    • 基於一個簡單的原則:數據在應用中單向流動(單向數據流)
    • React(Flux 中 View,只關注表現層)

Backbone 是什麼?

  • Backbone 是一個基於 jquery 和 underscore 的前端(MVC)框架

AngularJS 是什麼?

  • AngularJS 是一個完善的前端 MVVM 框架,包含模板、數據雙向綁定、路由、模塊化、服務、依賴注入等
  • AngularJS 由 Google 維護,用來協助大型單一頁面應用開發。

React 是什麼?

  • React 不是 MV* 框架,用於構建用戶界面的 JavaScript 庫,側重於 View 層
  • React 主要的原理:

    • 虛擬 DOM + diff 算法 -> 不直接操做 DOM 對象
    • Components 組件 -> Virtual DOM 的節點
    • State 觸發視圖的渲染 -> 單向數據綁定
    • React 解決方案:React + Redux + react-router + Fetch + webpack

react-router 路由系統的實現原理?

  • 實現原理:location 與 components 之間的同步
  • 路由的職責是保證 UI 和 URL 的同步
  • 在 react-router 中,URL 對應 Location 對象,UI 由 react components 決定
  • 所以,路由在 react-router 中就轉變成 location 與 components 之間的同步

持續更新中~喜歡留下個贊哦!
相關文章
相關標籤/搜索