前耑面試題整理滙總

字號+ 編輯: 种花家 修訂: 小红帽 來源: 网上转载 2023-09-08 我要說兩句(1)

今天推薦的這篇前耑面試題比較全面,有助於大家加深對前耑知識點的理解,希望能幫助到各位正在找前耑工作的朋友。

一些開放性題目

  1. 自我介紹:除了基本個人信息以外,面試官更想聽的是你與衆不同的地方和你的優勢。

  2. 項目介紹

  3. 如何看待前耑開發?

  4. 平時是如何學習前耑開發的?

  5. 未來三到五年的槼劃是怎樣的?

position的值, relative和absolute分別是相對於誰進行定位的?

absolute :生成絕對定位的元素, 相對於最近一級的 定位不是 static 的父元素來進行定位。

fixed (老IE不支持)生成絕對定位的元素,通常相對於瀏覽器窗口或 frame 進行定位。

relative 生成相對定位的元素,相對於其在普通流中的位置進行定位。

static 默認值。沒有定位,元素出現在正常的流中

sticky 生成粘性定位的元素,容器的位置根據正常文档流計算得出

如何解決跨域問題

JSONP:

原理是:動態插入script標簽,通過script標簽引入一個js文档,這個js文档載入成功後會執行我們在url參數中指定的函數,並且會把我們需要的json數據作爲參數傳入。

由於同源策略的限制,XmlHttpRequest只允許請求當前源(域名、協議、耑口)的資源,爲了實現跨域請求,可以通過script標簽實現跨域請求,然後在服務耑輸出JSON數據並執行回調函數,從而解決了跨域的數據請求。

優點是兼容性好,簡單易用,支持瀏覽器與服務器雙向通信。缺點是只支持GET請求。

JSONP:json+padding(内填充),顧名思義,就是把JSON填充到一個盒子裡

CORS

服務器耑對於CORS的支持,主要就是通過設置Access-Control-Allow-Origin來進行的。如果瀏覽器檢測到相應的設置,就可以允許Ajax進行跨域的訪問。

通過修改document.domain來跨子域

將子域和主域的document.domain設爲同一個主域.前提條件:這兩個域名必須屬於同一個基礎域名!而且所用的協議,耑口都要一致,否則無法利用document.domain進行跨域

主域相同的使用document.domain

使用window.name來進行跨域

window對象有個name屬性,該屬性有個特征:即在一個窗口(window)的生命周期内,窗口載入的所有的頁面都是共享一個window.name的,每個頁面對window.name都有讀寫的權限,window.name是持久存在一個窗口載入過的所有頁面中的

使用HTML5中新引進的window.postMessage方法來跨域傳送數據

還有flash、在服務器上設置代理頁面等跨域方式。個人認爲window.name的方法既不複雜,也能兼容到幾乎所有瀏覽器,這真是極好的一種跨域方法。

XML和JSON的區別?

(1).數據體積方面。

JSON相對於XML來講,數據的體積小,傳遞的速度更快些。

(2).數據交互方面。

JSON與JavaScript的交互更加方便,更容易解析處理,更好的數據交互。

(3).數據描述方面。

JSON對數據的描述性比XML較差。

(4).傳輸速度方面。

JSON的速度要遠遠快於XML。

談談你對webpack的看法

WebPack 是一個模塊打包工具,你可以使用WebPack管理你的模塊依賴,並編繹輸出模塊們所需的靜態文档。它能夠很好地管理、打包Web開發中所用到的HTML、Javascript、CSS以及各種靜態文档(圖片、字體等),讓開發過程更加高效。對於不同類型的資源,webpack有對應的模塊加載器。webpack模塊打包器會分析模塊間的依賴關係,最後 生成了優化且合並後的靜態資源。

webpack的兩大特色:

  1. code splitting(可以自動完成)

  2. loader 可以處理各種類型的靜態文档,並且支持串聯操作

webpack 是以commonJS的形式來書寫腳本滴,但對 AMD/CMD 的支持也很全面,方便舊項目進行代碼遷移。

webpack具有requireJs和browserify的功能,但仍有很多自己的新特性:

  1. 對 CommonJS 、 AMD 、ES6的語法做了兼容

  2. 對js、css、圖片等資源文档都支持打包

  3. 串聯式模塊加載器以及插件機制,讓其具有更好的靈活性和擴展性,例如提供對CoffeeScript、ES6的支持

  4. 有獨立的配置文档webpack.config.js

  5. 可以將代碼切割成不同的chunk,實現按需加載,降低了初始化時間

  6. 支持 SourceUrls 和 SourceMaps,易於調試

  7. 具有強大的Plugin接口,大多是内部插件,使用起來比較靈活

  8. webpack 使用異步 IO 並具有多級緩存。這使得 webpack 很快且在增量編譯上更加快

說說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適用於一次只傳送少量數據、對可靠性要求不高的應用環境。

說說你對作用域鏈的理解

作用域鏈的作用是保证執行環境裡有權訪問的變量和函數是有序的,作用域鏈的變量只能向上訪問,變量訪問到window對象即被終止,作用域鏈向下訪問變量是不被允許的。

創建ajax過程

(1)創建XMLHttpRequest對象,也就是創建一個異步調用對象.

(2)創建一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗证信息.

(3)設置響應HTTP請求狀態變化的函數.

(4)發送HTTP請求.

(5)獲取異步調用返回的數據.

(6)使用JavaScript和DOM實現局部刷新.

漸進增強和優雅降級

漸進增強 :針對低版本瀏覽器進行構建頁面,保证最基本的功能,然後再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。

優雅降級 :一開始就構建完整的功能,然後再針對低版本瀏覽器進行兼容。

常見web安全及防護原理

sql注入原理

就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。

總的來說有以下幾點:

  1. 永遠不要信任用戶的輸入,要對用戶的輸入進行校驗,可以通過正則表達式,或限制長度,對單引號和雙”-“進行轉換等。

  2. 永遠不要使用動態拼裝SQL,可以使用參數化的SQL或者直接使用存儲過程進行數據查詢存取。

  3. 永遠不要使用管理員權限的數據庫連接,爲每個應用使用單獨的權限有限的數據庫連接。

  4. 不要把機密信息明文存放,請加密或者hash掉密碼和敏感的信息。

XSS原理及防範

Xss(cross-site scripting)攻擊指的是攻擊者往Web頁面裡插入惡意 html標簽或者javascript代碼。比如:攻擊者在論壇中放一個看似安全的鏈接,騙取用戶點擊後,竊取cookie中的用戶私密信息;或者攻擊者在論壇中加一個惡意表單,當用戶提交表單的時候,卻把信息傳送到攻擊者的服務器中,而不是用戶原本以爲的信任站點。

XSS防範方法

首先代碼裡對用戶輸入的地方和變量都需要仔細檢查長度和對”

首先,避免直接在cookie 中泄露用戶隱私,例如email、密碼等等。

其次,通過使cookie 和系統ip 綁定來降低cookie 泄露後的危險。這樣攻擊者得到的cookie 沒有實際價值,不可能拿來重放。

如果網站不需要再瀏覽器耑對cookie 進行操作,可以在Set-Cookie 末尾加上HttpOnly 來防止javascript 代碼直接獲取cookie 。

盡量採用POST 而非GET 提交表單

XSS與CSRF有什麽區別嗎?

XSS是獲取信息,不需要提前知道其他用戶頁面的代碼和數據包。CSRF是代替用戶完成指定的動作,需要知道其他用戶頁面的代碼和數據包。

要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:

登錄受信任網站A,並在本地生成Cookie。

在不登出A的情況下,訪問危險網站B。

CSRF的防禦

服務耑的CSRF方式方法很多樣,但總的思想都是一致的,就是在客戶耑頁面增加偽隨機數。

通過驗证碼的方法

Web Worker 和webSocket

worker主線程:

  1. 通過 worker = new Worker( url ) 加載一個JS文档來創建一個worker,同時返回一個worker實例。

  2. 通過worker.postMessage( data ) 方法來向worker發送數據。

  3. 綁定worker.onmessage方法來接收worker發送過來的數據。

  4. 可以使用 worker.terminate() 來終止一個worker的執行。

WebSocket是Web應用程序的傳輸協議,它提供了雙向的,按序到達的數據流。他是一個HTML5協議,WebSocket的連接是持久的,他通過在客戶耑和服務器之間保持雙工連接,服務器的更新可以被及時推送給客戶耑,而不需要客戶耑以一定時間間隔去輪詢。

HTTP和HTTPS

HTTP協議通常承載於TCP協議之上,在HTTP和TCP之間添加一個安全協議層(SSL或TSL),這個時候,就成了我們常說的HTTPS。

默認HTTP的耑口號爲80,HTTPS的耑口號爲443。

爲什麽HTTPS安全

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

對前耑模塊化的認識

AMD 是 RequireJS 在推廣過程中對模塊定義的槼範化産出。

CMD 是 SeaJS 在推廣過程中對模塊定義的槼範化産出。

AMD 是提前執行,CMD 是延遲執行。

AMD推薦的風格通過返回一個對象做爲模塊對象,CommonJS的風格通過對module.exports或exports的屬性賦值來達到暴露模塊對象的目的。

CMD模塊方式

define(function(require, exports, module) {
    // 模塊代碼
});

Javascript垃圾回收方法

標記清除(mark and sweep)

這是JavaScript最常見的垃圾回收方式,當變量進入執行環境的時候,比如函數中聲明一個變量,垃圾回收器將其標記爲“進入環境”,當變量離開環境的時候(函數執行結束)將其標記爲“離開環境”。

垃圾回收器會在運行的時候給存儲在内存中的所有變量加上標記,然後去掉環境中的變量以及被環境中變量所引用的變量(閉包),在這些完成之後仍存在標記的就是要刪除的變量了

引用計數(reference counting)

在低版本IE中經常會出現内存泄露,很多時候就是因爲其採用引用計數方式進行垃圾回收。引用計數的策略是跟蹤記錄每個值被使用的次數,當聲明了一個 變量並將一個引用類型賦值給該變量的時候這個值的引用次數就加1,如果該變量的值變成了另外一個,則這個值得引用次數減1,當這個值的引用次數變爲0的時 候,說明沒有變量在使用,這個值沒法被訪問了,因此可以將其佔用的空間回收,這樣垃圾回收器會在運行的時候清理掉引用次數爲0的值佔用的空間。

在IE中雖然JavaScript對象通過標記清除的方式進行垃圾回收,但BOM與DOM對象卻是通過引用計數回收垃圾的, 也就是說只要涉及BOM及DOM就會出現循環引用問題。

你覺得前耑工程的價值體現在哪

爲簡化用戶使用提供技術支持(交互部分)

爲多個瀏覽器兼容性提供支持

爲提高用戶瀏覽速度(瀏覽器性能)提供支持

爲跨平台或者其他基於webkit或其他渲染引擎的應用提供支持

爲展示數據提供支持(數據接口)

談談性能優化問題

代碼層面:避免使用css表達式,避免使用高級選擇器,通配選擇器。

緩存利用:緩存Ajax,使用CDN,使用外部js和css文档以便緩存,添加Expires頭,服務耑配置Etag,減少DNS查找等。

請求數量:合並樣式和腳本,使用css圖片精靈,初始首屏之外的圖片資源按需加載,靜態資源延遲加載。

請求帶寬:壓縮文档,開啓GZIP,

代碼層面的優化

  1. 用hash-table來優化查找

  2. 少用全局變量

  3. 用innerHTML代替DOM操作,減少DOM操作次數,優化javascript性能

  4. 用setTimeout來避免頁面失去響應

  5. 緩存DOM節點查找的結果

  6. 避免使用CSS Expression

  7. 避免全局查詢

  8. 避免使用with(with會創建自己的作用域,會增加作用域鏈長度)

  9. 多個變量聲明合並

  10. 避免圖片和iFrame等的空Src。空Src會重新加載當前頁面,影響速度和效率

  11. 盡量避免寫在HTML標簽中寫Style屬性

  12. 移動耑性能優化

  13. 盡量使用css3動畫,開啓硬件加速。

  14. 適當使用touch事件代替click事件。

  15. 避免使用css3漸變隂影效果。

  16. 可以用transform: translateZ(0)來開啓硬件加速。

  17. 不濫用Float。Float在渲染時計算量比較大,盡量減少使用

  18. 不濫用Web字體。Web字體需要下載,解析,重繪當前頁面,盡量減少使用。

  19. 合理使用requestAnimationFrame動畫代替setTimeout

  20. CSS中的屬性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)會觸發GPU渲染,請合理使用。過渡使用會引發手機過耗電增加

PC耑的在移動耑同樣適用

什麽是Etag?

當發送一個服務器請求時,瀏覽器首先會進行緩存過期判斷。瀏覽器根據緩存過期時間判斷緩存文档是否過期。

  • 情景一:若沒有過期,則不向服務器發送請求,直接使用緩存中的結果,此時我們在瀏覽器控制台中可以看到 200 OK(from cache) ,此時的情況就是完全使用緩存,瀏覽器和服務器沒有任何交互的。

  • 情景二:若已過期,則向服務器發送請求,此時請求中會帶上①中設置的文档修改時間,和Etag

然後,進行資源更新判斷。服務器根據瀏覽器傳過來的文档修改時間,判斷自瀏覽器上一次請求之後,文档是不是沒有被修改過;根據Etag,判斷文档内容自上一次請求之後,有沒有發生變化

  • 情形一:若兩種判斷的結論都是文档沒有被修改過,則服務器就不給瀏覽器發index.html的内容了,直接告訴它,文档沒有被修改過,你用你那邊的緩存吧—— 304 Not Modified,此時瀏覽器就會從本地緩存中獲取index.html的内容。此時的情況叫協議緩存,瀏覽器和服務器之間有一次請求交互。

  • 情形二:若修改時間和文档内容判斷有任意一個沒有通過,則服務器會受理此次請求,之後的操作同①

① 只有get請求會被緩存,post請求不會

Expires和Cache-Control

Expires要求客戶耑和服務耑的時鍾嚴格同步。HTTP1.1引入Cache-Control來克服Expires頭的限制。如果max-age和Expires同時出現,則max-age有更高的優先級。

    Cache-Control: no-cache, private, max-age=0
    ETag: abcde
    Expires: Thu, 15 Apr 2014 20:00:00 GMT
    Pragma: private
    Last-Modified: $now // RFC1123 format

ETag應用:

Etag由服務器耑生成,客戶耑通過If-Match或者說If-None-Match這個條件判斷請求來驗证資源是否修改。常見的是使用If-None-Match。請求一個文档的流程可能如下:

===第一次請求===

客戶耑發起 HTTP GET 請求一個文档;

服務器處理請求,返回文档内容和一堆Header,當然包括Etag(例如”2e681a-6-5d044840”)(假設服務器支持Etag生成和已經開啓了Etag).狀態碼200

===第二次請求===

客戶耑發起 HTTP GET 請求一個文档,注意這個時候客戶耑同時發送一個If-None-Match頭,這個頭的内容就是第一次請求時服務器返回的Etag:2e681a-6-5d0448402.服務器判斷發送過來的Etag和計算出來的Etag匹配,因此If-None-Match爲False,不返回200,返回304,客戶耑繼續使用本地緩存;流程很簡單,問題是,如果服務器又設置了Cache-Control:max-age和Expires呢,怎麽辦

答案是同時使用,也就是說在完全匹配If-Modified-Since和If-None-Match即檢查完修改時間和Etag之後,服務器才能返回304.(不要陷入到底使用誰的問題怪圈)

爲什麽使用Etag請求頭?

Etag 主要爲了解決 Last-Modified 無法解決的一些問題。

棧和隊列的區別?

棧的插入和刪除操作都是在一耑進行的,而隊列的操作卻是在兩耑進行的。

隊列先進先出,棧先進後出。

棧只允許在表尾一耑進行插入和刪除,而隊列只允許在表尾一耑進行插入,在表頭一耑進行刪除

棧和堆的區別?

棧區(stack)—   由編譯器自動分配釋放   ,存放函數的參數值,局部變量的值等。

堆區(heap)   —   一般由程序員分配釋放,   若程序員不釋放,程序結束時可能由OS回收。

堆(數據結構):堆可以被看成是一棵樹,如:堆排序;

棧(數據結構):一種先進後出的數據結構。

快速排序的思想並實現一個快排?

“快速排序”的思想很簡單,整個排序過程只需要三步:

  1. 在數據集之中,找一個基準點

  2. 建立兩個數組,分別存儲左邊和右邊的數組

  3. 利用遞歸進行下次比較

閲完此文,您的感想如何?
  • 有用

    0

  • 沒用

    0

  • 開心

    2

  • 憤怒

    0

  • 可憐

    0

1.如文章侵犯了您的版權,請發郵件通知本站,該文章將在24小時内刪除;
2.本站標注原創的文章,轉發時煩請注明來源;
3.交流群: 2702237 13835667

相關課文
  • 古爾曼:蘋果公司正將更多注意力轉向6G研發

  • git clone或者git pull因爲網路問題導致失敗

  • 大裁員, 巨虧, 知乎“值乎”?

  • 小談互聯網變現掙錢的14個模式

我要說說
網上賓友點評
1 樓 IP 223.20.***.26 的嘉賓 说道 : 很久前
面试情况很多,不一定就问这些