前端面試題小合集(含答案)

前端面試題小合集(含答案)

Front-end-frame-relative

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

  • 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 規範的區別?

  • 規範化產出:
  • AMD 由 RequireJS 推廣產出
  • CMD 由 SeaJS 推廣產出
  • 模塊的依賴:
  • AMD 提前執行,推崇依賴前置
  • CMD 延遲執行,推崇依賴就近
  • API 功能:
  • AMD 的 API 默認多功能(分全局 require 和局部 require)
  • CMD 的 API 推崇職責單一純粹(沒有全局 require)
  • 模塊定義規則:
  • 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 的模塊管理和發佈工具

什麼是 WebKit ?

  • WebKit 是一個開源的瀏覽器內核,由渲染引擎(WebCore)和JS解釋引擎(JSCore)組成
  • 通常所說的 WebKit 指的是 WebKit(WebCore),主要工作是進行 HTML/CSS 渲染
  • WebKit 一直是 Safari 和 Chrome(之前) 使用的瀏覽器內核,後來 Chrome 改用Blink 內核

如何測試前端代碼? 知道 Unit Test,BDD, TDD 麼? 怎麼測試你的前端工程(mocha, jasmin..)?

  • 通過為前端代碼編寫單元測試(Unit Test)來測試前端代碼
  • Unit Test:一段用於測試一個模塊或接口是否能達到預期結果的代碼
  • BDD:行為驅動開發 -- 業務需求描述產出產品代碼的開發方法
  • TDD:測試驅動開發 -- 單元測試用例代碼產出產品代碼的開發方法
  • 單元測試框架:
// mocha 示例
describe('Test add', function() {
it('1 + 2 = 3', function() {
expect(add(1, 2)).to.be.equal(3);
});
});
// jasmin 示例
describe('Test add', function () {
it('1 + 2 = 3', function () {
expect(add(1, 2)).toEqual(3);
});
});

介紹你知道的前端模板引擎?

  • artTemplate, underscore, handlebars

什麼是 Modernizr? Modernizr 工作原理?

  • Modernizr 是一個開源的 JavaScript 庫,用於檢測用戶瀏覽器對 HTML5 與 CSS3 的支持情況

移動端最小觸控區域是多大?

  • 44 * 44 px

移動端的點擊事件的延遲時間是多長,為什麼會有延遲? 如何解決這個延時?

  • 移動端 click 有 300ms 延遲,瀏覽器為了區分“雙擊”(放大頁面)還是“單擊”而設計
  • 解決方案:
  • 禁用縮放(對safari無效)
  • 使用指針事件(IE私有特性,且僅IE10+)
  • 使用 Zepto 的 tap 事件(有點透BUG)
  • 使用 FastClick 插件(體積大[壓縮後8k])

什麼是函數式編程?

  • 函數式編程是一種"編程範式",主要思想是把運算過程儘量寫成一系列嵌套的函數調用
  • 例如: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(職責連) 處理請求組成的對象一條鏈,請求鏈中傳遞,直到有對象可以處理

什麼是前端工程化?

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

HTTP

http狀態碼有那些?分別代表是什麼意思?

 簡單版
[
100 Continue 繼續,一般在發送post請求時,已發送了http header之後服務端將返回此信息,表示確認,之後發送具體參數信息
200 OK 正常返回信息
201 Created 請求成功並且服務器創建了新的資源
202 Accepted 服務器已接受請求,但尚未處理

301 Moved Permanently 請求的網頁已永久移動到新位置。
302 Found 臨時性重定向。
303 See Other 臨時性重定向,且總是使用 GET 請求新的 URI。
304 Not Modified 自從上次請求後,請求的網頁未修改過。
400 Bad Request 服務器無法理解請求的格式,客戶端不應當嘗試再次使用相同的內容發起請求。
401 Unauthorized 請求未授權。
403 Forbidden 禁止訪問。
404 Not Found 找不到如何與 URI 相匹配的資源。
500 Internal Server Error 最常見的服務器端錯誤。
503 Service Unavailable 服務器端暫時無法處理請求(可能是過載或維護)。
]

一個頁面從輸入 URL 到頁面加載顯示完成,這個過程中都發生了什麼?(流程說的越詳細越好)

  • 注:這題勝在區分度高,知識點覆蓋廣,再不懂的人,也能答出幾句,
  • 而高手可以根據自己擅長的領域自由發揮,從URL規範、HTTP協議、DNS、CDN、數據庫查詢、
  • 到瀏覽器流式解析、CSS規則構建、layout、paint、onload/domready、JS執行、JS API綁定等等;
  • 詳細版:
  • 瀏覽器會開啟一個線程來處理這個請求,對 URL 分析判斷如果是 http 協議就按照 Web 方式來處理;
  • 調用瀏覽器內核中的對應方法,比如 WebView 中的 loadUrl 方法;
  • 通過DNS解析獲取網址的IP地址,設置 UA 等信息發出第二個GET請求;
  • 進行HTTP協議會話,客戶端發送報頭(請求報頭);
  • 進入到web服務器上的 Web Server,如 Apache、Tomcat、Node.JS 等服務器;
  • 進入部署好的後端應用,如 PHP、Java、JavaScript、Python 等,找到對應的請求處理;
  • 處理結束回饋報頭,此處如果瀏覽器訪問過,緩存上有對應資源,會與服務器最後修改時間對比,一致則返回304;
  • 瀏覽器開始下載html文檔(響應報頭,狀態碼200),同時使用緩存;
  • 文檔樹建立,根據標記請求所需指定MIME類型的文件(比如css、js),同時設置了cookie;
  • 頁面開始渲染DOM,JS根據DOM API操作DOM,執行事件綁定等,頁面顯示完成。
  • 簡潔版:
  • 瀏覽器根據請求的URL交給DNS域名解析,找到真實IP,向服務器發起請求;
  • 服務器交給後臺處理完成後返回數據,瀏覽器接收文件(HTML、JS、CSS、圖象等);
  • 瀏覽器對加載到的資源(HTML、JS、CSS等)進行語法解析,建立相應的內部數據結構(如HTML的DOM);
  • 載入解析到的資源文件,渲染頁面,完成。

說說TCP傳輸的三次握手四次揮手策略

  • 為了準確無誤地把數據送達目標處,TCP協議採用了三次握手策略。用TCP協議把數據包送出去後,TCP不會對傳送 後的情況置之不理,它一定會向對方確認是否成功送達。握手過程中使用了TCP的標誌:SYN和ACK
  • 發送端首先發送一個帶SYN標誌的數據包給對方。接收端收到後,回傳一個帶有SYN/ACK標誌的數據包以示傳達確認信息。 最後,發送端再回傳一個帶ACK標誌的數據包,代表“握手”結束。 若在握手過程中某個階段莫名中斷,TCP協議會再次以相同的順序發送相同的數據包

斷開一個TCP連接則需要“四次握手”:

  • 第一次揮手:主動關閉方發送一個FIN,用來關閉主動方到被動關閉方的數據傳送,也就是主動關閉方告訴被動關閉方:我已經不 會再給你發數據了(當然,在fin包之前發送出去的數據,如果沒有收到對應的ack確認報文,主動關閉方依然會重發這些數據),但是,此時主動關閉方還可 以接受數據
  • 第二次揮手:被動關閉方收到FIN包後,發送一個ACK給對方,確認序號為收到序號+1(與SYN相同,一個FIN佔用一個序號)
  • 第三次揮手:被動關閉方發送一個FIN,用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,我的數據也發送完了,不會再給你發數據了
  • 第四次揮手:主動關閉方收到FIN後,發送一個ACK給被動關閉方,確認序號為收到序號+1,至此,完成四次揮手

TCP和UDP的區別

  • TCP(Transmission Control Protocol,傳輸控制協議)是基於連接的協議,也就是說,在正式收發數據前,必須和對方建立可靠的連接。一個TCP連接必須要經過三次“對話”才能建立起來
  • UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非連接的協議,它不與對方建立連接,而是直接就把數據包發送過去! UDP適用於一次只傳送少量數據、對可靠性要求不高的應用環境

HTTP和HTTPS

  • HTTP協議通常承載於TCP協議之上,在HTTP和TCP之間添加一個安全協議層(SSL或TSL),這個時候,就成了我們常說的HTTPS
  • 默認HTTP的端口號為80,HTTPS的端口號為443

為什麼HTTPS安全

  • 因為網絡請求需要中間有很多的服務器路由器的轉發。中間的節點都可能篡改信息,而如果使用HTTPS,密鑰在你和終點站才有。https之所以比http安全,是因為他利用ssl/tls協議傳輸。它包含證書,卸載,流量轉發,負載均衡,頁面適配,瀏覽器適配,refer傳遞等。保障了傳輸過程的安全性

關於Http 2.0 你知道多少?

  • HTTP/2引入了“服務端推(server push)”的概念,它允許服務端在客戶端需要數據之前就主動地將數據發送到客戶端緩存中,從而提高性能。
  • HTTP/2提供更多的加密支持
  • HTTP/2使用多路技術,允許多個消息在一個連接上同時交差。
  • 它增加了頭壓縮(header compression),因此即使非常小的請求,其請求和響應的header都只會佔用很小比例的帶寬

GET和POST的區別,何時使用POST?

  • GET:一般用於信息獲取,使用URL傳遞參數,對所發送信息的數量也有限制,一般在2000個字符
  • POST:一般用於修改服務器上的資源,對所發送的信息沒有限制。
  • GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值,也就是說Get是通過地址欄來傳值,而Post是通過提交表單來傳值。
  • 然而,在以下情況中,請使用 POST 請求:
  • 無法使用緩存文件(更新服務器上的文件或數據庫)

  • 向服務器發送大量數據(POST 沒有數據量限制)
  • 發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠

說說網絡分層裡七層模型是哪七層

  • 應用層:應用層、表示層、會話層(從上往下)(HTTP、FTP、SMTP、DNS)
  • 傳輸層(TCP和UDP)
  • 網絡層(IP)
  • 物理和數據鏈路層(以太網)
  • 每一層的作用如下:
  • 物理層:通過媒介傳輸比特,確定機械及電氣規範(比特Bit) 數據鏈路層:將比特組裝成幀和點到點的傳遞(幀Frame)
  • 網絡層:負責數據包從源到宿的傳遞和網際互連(包PackeT)
  • 傳輸層:提供端到端的可靠報文傳遞和錯誤恢復(段Segment)
  • 會話層:建立、管理和終止會話(會話協議數據單元SPDU)
  • 表示層:對數據進行翻譯、加密和壓縮(表示協議數據單元PPDU)
  • 應用層:允許訪問OSI環境的手段(應用協議數據單元APDU)

講講304緩存的原理

  • 服務器首先產生ETag,服務器可在稍後使用它來判斷頁面是否已經被修改。本質上,客戶端通過將該記號傳回服務器要求服務器驗證其(客戶端)緩存
  • 304是HTTP狀態碼,服務器用來標識這個文件沒修改,不返回內容,瀏覽器在接收到個狀態碼後,會使用瀏覽器已緩存的文件
  • 客戶端請求一個頁面(A)。 服務器返回頁面A,並在給A加上一個ETag。 客戶端展現該頁面,並將頁面連同ETag一起緩存。 客戶再次請求頁面A,並將上次請求時服務器返回的ETag一起傳遞給服務器。 服務器檢查該ETag,並判斷出該頁面自上次客戶端請求之後還未被修改,直接返回響應304(未修改——Not Modified)和一個空的響應體

HTTP/2 與 HTTP/1.x 的關鍵區別

  • 二進制協議代替文本協議,更加簡潔高效
  • 針對每個域只使用一個多路複用的連接
  • 壓縮頭部信息減小開銷
  • 允許服務器主動推送應答到客戶端的緩存中

一個頁面從輸入 URL 到頁面加載顯示完成,這個過程中都發生了什麼?

  • 01.瀏覽器查找域名對應的IP地址(DNS 查詢:瀏覽器緩存->系統緩存->路由器緩存->ISP DNS 緩存->根域名服務器)
  • 02.瀏覽器向 Web 服務器發送一個 HTTP 請求(TCP三次握手)
  • 03.服務器 301 重定向(從 http://example.com 重定向到 http://www.example.com)
  • 04.瀏覽器跟蹤重定向地址,請求另一個帶 www 的網址
  • 05.服務器處理請求(通過路由讀取資源)
  • 06.服務器返回一個 HTTP 響應(報頭中把 Content-type 設置為 'text/html')
  • 07.瀏覽器進 DOM 樹構建
  • 08.瀏覽器發送請求獲取嵌在 HTML 中的資源(如圖片、音頻、視頻、CSS、JS等)
  • 09.瀏覽器顯示完成頁面
  • 10.瀏覽器發送異步請求

Ajax

  • 什麼是 Ajax? 如何創建一個Ajax?
  • AJAX(Asynchronous Javascript And XML) = 異步 JavaScript + XML 在後臺與服務器進行異步數據交換,不用重載整個網頁,實現局部刷新。
  • 創建 ajax 步驟:
  • 1.創建 XMLHttpRequest 對象
  • 2.創建一個新的 HTTP 請求,並指定該 HTTP 請求的類型、驗證信息
  • 3.設置響應 HTTP 請求狀態變化的回調函數
  • 4.發送 HTTP 請求
  • 5.獲取異步調用返回的數據
  • 6.使用 JavaScript 和 DOM 實現局部刷新
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) {
fn.call(this, xhr.responseText);
}
};
xhr.send(data);

localStorage

瀏覽器本地存儲

  • 在較高版本的瀏覽器中,js提供了sessionStorage和globalStorage。在HTML5中提供了localStorage來取代globalStorage
  • html5中的Web Storage包括了兩種存儲方式:sessionStorage和localStorage
  • sessionStorage用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問並且當會話結束後數據也隨之銷燬。因此sessionStorage不是一種持久化的本地存儲,僅僅是會話級別的存儲
  • 而localStorage用於持久化的本地存儲,除非主動刪除數據,否則數據是永遠不會過期的

web storage和cookie的區別

  • Web Storage的概念和cookie相似,區別是它是為了更大容量存儲設計的。Cookie的大小是受限的,並且每次你請求一個新的頁面的時候Cookie都會被髮送過去,這樣無形中浪費了帶寬,另外cookie還需要指定作用域,不可以跨域調用
  • 除此之外,WebStorage擁有setItem,getItem,removeItem,clear等方法,不像cookie需要前端開發者自己封裝setCookie,getCookie
  • 但是cookie也是不可以或缺的:cookie的作用是與服務器進行交互,作為HTTP規範的一部分而存在 ,而Web Storage僅僅是為了在本地“存儲”數據而生
  • 瀏覽器的支持除了IE7及以下不支持外,其他標準瀏覽器都完全支持(ie及FF需在web服務器裡運行),值得一提的是IE總是辦好事,例如IE7、IE6中的userData其實就是javascript本地存儲的解決方案。通過簡單的代碼封裝可以統一到所有的瀏覽器都支持web storage
  • localStorage和sessionStorage都具有相同的操作方法,例如setItem、getItem和removeItem等

cookie 和session 的區別:

  • 1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
  • 2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
  • 考慮到安全應當使用session。
  • 3、session會在一定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能
  • 考慮到減輕服務器性能方面,應當使用COOKIE。
  • 4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
  • 5、所以個人建議:
  • 將登陸信息等重要信息存放為SESSION

  • 其他信息如果需要保留,可以放在COOKIE中

描述 cookies、sessionStorage 和 localStorage 的區別?

  • 與服務器交互:
  • cookie 是網站為了標示用戶身份而儲存在用戶本地終端上的數據(通常經過加密)
  • cookie 始終會在同源 http 請求頭中攜帶(即使不需要),在瀏覽器和服務器間來回傳遞
  • sessionStorage 和 localStorage 不會自動把數據發給服務器,僅在本地保存
  • 存儲大小:
  • cookie 數據根據不同瀏覽器限制,大小一般不能超過 4k
  • sessionStorage 和 localStorage 雖然也有存儲大小的限制,但比cookie大得多,可以達到5M或更大
  • 有期時間:
  • localStorage 存儲持久數據,瀏覽器關閉後數據不丟失除非主動刪除數據
  • sessionStorage 數據在當前瀏覽器窗口關閉後自動刪除
  • cookie 設置的cookie過期時間之前一直有效,與瀏覽器是否關閉無關

Json-XML

XML和JSON的區別?

  • 數據體積方面
  • JSON相對於XML來講,數據的體積小,傳遞的速度更快些。
  • 數據交互方面
  • JSON與JavaScript的交互更加方便,更容易解析處理,更好的數據交互
  • 數據描述方面
  • JSON對數據的描述性比XML較差
  • 傳輸速度方面
  • JSON的速度要遠遠快於XML

JSON 的瞭解?

  • JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式
  • 它是基於JavaScript的一個子集。數據格式簡單, 易於讀寫, 佔用帶寬小
  • JSON字符串轉換為JSON對象:
var obj =eval('('+ str +')');
var obj = str.parseJSON();
var obj = JSON.parse(str);
  • JSON對象轉換為JSON字符串:
var last=obj.toJSONString();
var last=JSON.stringify(obj);

都看到這了轉發一下唄,關注並私信回覆“前端資源”有小驚喜哦


分享到:


相關文章: