2018——前端面試常見問答

前端築夢師發表於2018-09-25
  1. 常用那幾種瀏覽器測試?有哪些核心(Layout Engine)?

(Q1) 瀏覽器:IE,Chrome,FireFox,Safari,Opera。

(Q2) 核心:Trident,Gecko,Presto,Webkit。

  1. 說下行內元素和塊級元素的區別?行內塊元素的相容性使用?(IE8 以下)

(Q1) 行內元素:會在水平方向排列,不能包含塊級元素,設定width無效,height無效(可以設定line-height),margin上下無效,padding上下無效。

塊級元素:各佔據一行,垂直方向排列。從新行開始結束接著一個斷行。

(Q2) 相容性:display:inline-block;*display:inline;*zoom:1;

  1. 清除浮動有哪些方式?比較好的方式是哪一種?

(Q1)

(1)父級div定義height。

(2)結尾處加空div標籤clear:both。

(3)父級div定義偽類:after和zoom。

(4)父級div定義overflow:hidden。

(5)父級div定義overflow:auto。

(6)父級div也浮動,需要定義寬度。

(7)父級div定義display:table。

(8)結尾處加br標籤clear:both。

(Q2) 比較好的是第3種方式,好多網站都這麼用。

  1. box-sizing常用的屬性有哪些?分別有什麼作用?

(Q1)box-sizing: content-box|border-box|inherit;

(Q2)content-box:寬度和高度分別應用到元素的內容框。在寬度和高度之外繪製元素的內邊距和邊框(元素預設效果)。

border-box:元素指定的任何內邊距和邊框都將在已設定的寬度和高度內進行繪製。通過從已設定的寬度和高度分別減去邊框和內邊距才能得到內容的寬度和高度。

  1. Doctype作用?標準模式與相容模式各有什麼區別?

(Q1) <!DOCTYPE>告知瀏覽器的解析器用什麼文件標準解析這個文件。DOCTYPE不存在或格式不正確會導致文件以相容模式呈現。

(Q2) 標準模式的排版和JS運作模式都是以該瀏覽器支援的最高標準執行。在相容模式中,頁面以寬鬆的向後相容的方式顯示,模擬老式瀏覽器的行為以防止站點無法工作。

  1. HTML5 為什麼只需要寫 ?

HTML5不基於 SGML,因此不需要對DTD進行引用,但是需要doctype來規範瀏覽器的行為(讓瀏覽器按照它們應該的方式來執行)。

而HTML4.01基於SGML,所以需要對DTD進行引用,才能告知瀏覽器文件所使用的文件型別。

  1. 頁面匯入樣式時,使用link和@import有什麼區別?

(1)link屬於XHTML標籤,除了載入CSS外,還能用於定義RSS, 定義rel連線屬性等作用;而@import是CSS提供的,只能用於載入CSS;

(2)頁面被載入的時,link會同時被載入,而@import引用的CSS會等到頁面被載入完再載入;

(3)import是CSS2.1 提出的,只在IE5以上才能被識別,而link是XHTML標籤,無相容問題。

  1. 介紹一下你對瀏覽器核心的理解?

主要分成兩部分:渲染引擎(layout engineer或Rendering Engine)和js引擎。

渲染引擎:負責取得網頁的內容(HTML、XML、影象等等)、整理訊息(例如加入CSS等),以及計算網頁的顯示方式,然後會輸出至顯示器或印表機。

瀏覽器的核心的不同對於網頁的語法解釋會有不同,所以渲染的效果也不相同。所有網頁瀏覽器、電子郵件客戶端以及其它需要編輯、顯示網路內容的應用程式都需要核心。

JS引擎則:解析和執行javascript來實現網頁的動態效果。

最開始渲染引擎和JS引擎並沒有區分的很明確,後來JS引擎越來越獨立,核心就傾向於只指渲染引擎。

  1. html5有哪些新特性?如何處理HTML5新標籤的瀏覽器相容問題?如何區分 HTML 和 HTML5?

(Q1)

HTML5 現在已經不是 SGML 的子集,主要是關於影象,位置,儲存,多工等功能的增加。

(1)繪畫 canvas;

(2)用於媒介回放的 video 和 audio 元素;

(3)本地離線儲存 localStorage 長期儲存資料,瀏覽器關閉後資料不丟失;

(4)sessionStorage 的資料在瀏覽器關閉後自動刪除;

(5)語意化更好的內容元素,比如 article、footer、header、nav、section;

(6)表單控制元件,calendar、date、time、email、url、search;

(7)新的技術webworker, websocket, Geolocation;

(Q2)

IE8/IE7/IE6支援通過document.createElement方法產生的標籤,

可以利用這一特性讓這些瀏覽器支援HTML5新標籤,

瀏覽器支援新標籤後,還需要新增標籤預設的樣式。

當然也可以直接使用成熟的框架、比如html5shim,

  1. 簡述一下你對HTML語義化的理解?

用正確的標籤做正確的事情。

html語義化讓頁面的內容結構化,結構更清晰,便於對瀏覽器、搜尋引擎解析;

即使在沒有樣式CSS情況下也以一種文件格式顯示,並且是容易閱讀的;

搜尋引擎的爬蟲也依賴於HTML標記來確定上下文和各個關鍵字的權重,利於seo;

使閱讀原始碼的人對網站更容易將網站分塊,便於閱讀維護理解。

JavaScript

  1. 介紹js的基本資料型別

Undefined、Null、Boolean、Number、String

  1. js有哪些內建物件?

資料封裝類物件:Object、Array、Boolean、Number 和 String

其他物件:Function、Arguments、Math、Date、RegExp、Error

  1. this物件的理解

this總是指向函式的直接呼叫者(而非間接呼叫者);

如果有new關鍵字,this指向new出來的那個物件;

在事件中,this指向觸發這個事件的物件,特殊的是,IE中的attachEvent中的this總是指向全域性物件Window。

  1. eval是做什麼的?

它的功能是把對應的字串解析成JS程式碼並執行;

應該避免使用eval,不安全,非常耗效能(2次,一次解析成js語句,一次執行)。

由JSON字串轉換為JSON物件的時候可以用eval,var obj =eval('('+ str +')')。

  1. DOM怎樣新增、移除、移動、複製、建立和查詢節點

// 建立新節點

createDocumentFragment() //建立一個DOM片段

createElement() //建立一個具體的元素

createTextNode() //建立一個文字節點

// 新增、移除、替換、插入

appendChild()

removeChild()

replaceChild()

insertBefore() //在已有的子節點前插入一個新的子節點

// 查詢

getElementsByTagName() //通過標籤名稱

getElementsByName() //通過元素的Name屬性的值(IE容錯能力較強,會得到一個陣列,其中包括id等於name值的)

getElementById() //通過元素Id,唯一性

  1. null和undefined的區別?

null是一個表示"無"的物件,轉為數值時為0;undefined是一個表示"無"的原始值,轉為數值時為NaN。

undefined:

(1)變數被宣告瞭,但沒有賦值時,就等於undefined。

(2) 呼叫函式時,應該提供的引數沒有提供,該引數等於undefined。

(3)物件沒有賦值的屬性,該屬性的值為undefined。

(4)函式沒有返回值時,預設返回undefined。

null:

(1) 作為函式的引數,表示該函式的引數不是物件。

(2) 作為物件原型鏈的終點。

  1. new操作符具體幹了什麼呢?

(1)建立一個空物件,並且 this 變數引用該物件,同時還繼承了該函式的原型。

(2)屬性和方法被加入到 this 引用的物件中。

(3)新建立的物件由 this 所引用,並且最後隱式的返回 this 。

  1. JSON 的瞭解?

JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。它是基於JavaScript的一個子集。資料格式簡單, 易於讀寫, 佔用頻寬小。

格式:採用鍵值對,例如:{'age':'12', 'name':'back'}

  1. call() 和 apply() 的區別和作用?

apply()函式有兩個引數:第一個引數是上下文,第二個引數是引數組成的陣列。如果上下文是null,則使用全域性物件代替。

如:function.apply(this,[1,2,3]);

call()的第一個引數是上下文,後續是例項傳入的引數序列。

如:function.call(this,1,2,3);

  1. 如何獲取UA?

function whatBrowser() {

document.Browser.Name.value=navigator.appName;

document.Browser.Version.value=navigator.appVersion;

document.Browser.Code.value=navigator.appCodeName;

document.Browser.Agent.value=navigator.userAgent;

} 其他

  1. 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 伺服器端暫時無法處理請求(可能是過載或維護)。

  1. 你有哪些效能優化的方法?

(1) 減少http請求次數:CSS Sprites, JS、CSS原始碼壓縮、圖片大小控制合適;網頁Gzip,CDN託管,data快取 ,圖片伺服器。

(2) 前端模板 JS+資料,減少由於HTML標籤導致的頻寬浪費,前端用變數儲存ajax請求結果,每次操作本地變數,不用請求,減少請求次數

(3) 用innerHTML代替DOM操作,減少DOM操作次數,優化javascript效能。

(4) 當需要設定的樣式很多時設定className而不是直接操作style。

(5) 少用全域性變數、快取DOM節點查詢的結果。減少IO讀取操作。

(6) 避免使用CSS Expression(css表示式)又稱Dynamic properties(動態屬性)。

(7) 圖片預載入,將樣式表放在頂部,將指令碼放在底部 加上時間戳。

  1. 什麼叫優雅降級和漸進增強?

優雅降級:web站點在所有新式瀏覽器中都能正常工作,如果使用者使用的是老式瀏覽器,則程式碼會檢查以確認它們是否能正常工作。

由於IE獨特的盒模型佈局問題,針對不同版本的IE的hack實踐過優雅降級了,為那些無法支援功能的瀏覽器增加候選方案,使之在舊式瀏覽器上以某種形式降級體驗卻不至於完全失效。

漸進增強:從被所有瀏覽器支援的基本功能開始,逐步地新增那些只有新式瀏覽器才支援的功能,向頁面增加無害於基礎瀏覽器的額外樣式和功能的。當瀏覽器支援時,它們會自動地呈現出來併發揮作用。

  1. 哪些常見操作會造成記憶體洩漏?

記憶體洩漏指任何物件在您不再擁有或需要它之後仍然存在。

垃圾回收器定期掃描物件,並計算引用了每個物件的其他物件的數量。如果一個物件的引用數量為 0(沒有其他物件引用過該物件),或對該物件的惟一引用是迴圈的,那麼該物件的記憶體即可回收。

setTimeout 的第一個引數使用字串而非函式的話,會引發記憶體洩漏。

閉包、控制檯日誌、迴圈(在兩個物件彼此引用且彼此保留時,就會產生一個迴圈)。

  1. 執行緒與程式的區別

一個程式至少有一個程式,一個程式至少有一個執行緒。

執行緒的劃分尺度小於程式,使得多執行緒程式的併發性高。

另外,程式在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

執行緒在執行過程中與程式還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程式的排程和管理以及資源分配。這就是程式和執行緒的重要區別。

相關文章