前端面試題整理彙總

發表於2016-11-17

本文旨在加深對前端知識點的理解,資料來源於網路,由 trigkit4 收集整理。

一些開放性題目

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

  • absolute :生成絕對定位的元素, 相對於最近一級的 定位不是 static 的父元素來進行定位。
  • fixed (老IE不支援)生成絕對定位的元素,通常相對於瀏覽器視窗或 frame 進行定位。
  • relative 生成相對定位的元素,相對於其在普通流中的位置進行定位。
  • static 預設值。沒有定位,元素出現在正常的流中
  • sticky 生成粘性定位的元素,容器的位置根據正常文件流計算得出

如何解決跨域問題

JSONP:

原理是:動態插入script標籤,通過script標籤引入一個js檔案,這個js檔案載入成功後會執行我們在url引數中指定的函式,並且會把我們需要的json資料作為引數傳入。

由於同源策略的限制,XmlHttpRequest只允許請求當前源(域名、協議、埠)的資源,為了實現跨域請求,可以通過script標籤實現跨域請求,然後在服務端輸出JSON資料並執行回撥函式,從而解決了跨域的資料請求。

優點是相容性好,簡單易用,支援瀏覽器與伺服器雙向通訊。缺點是隻支援GET請求。

JSONPjson+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的方法既不復雜,也能相容到幾乎所有瀏覽器,這真是極好的一種跨域方法。

XMLJSON的區別?

談談你對webpack的看法

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

webpack的兩大特色:

webpack 是以commonJS的形式來書寫指令碼滴,但對 AMD/CMD 的支援也很全面,方便舊專案進行程式碼遷移。

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

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

為了準確無誤地把資料送達目標處,TCP協議採用了三次握手策略。用TCP協議把資料包送出去後,TCP不會對傳送 後的情況置之不理,它一定會向對方確認是否成功送達。握手過程中使用了TCP的標誌:SYNACK

傳送端首先傳送一個帶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過程

漸進增強和優雅降級

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

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

常見web安全及防護原理

sql注入原理

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

總的來說有以下幾點:

XSS原理及防範

Xss(cross-site scripting)攻擊指的是攻擊者往Web頁面裡插入惡意 html標籤或者javascript程式碼。比如:攻擊者在論壇中放一個

看似安全的連結,騙取使用者點選後,竊取cookie中的使用者私密資訊;或者攻擊者在論壇中加一個惡意表單,

當使用者提交表單的時候,卻把資訊傳送到攻擊者的伺服器中,而不是使用者原本以為的信任站點。

XSS防範方法

首先程式碼裡對使用者輸入的地方和變數都需要仔細檢查長度和對”<”,”>”,”;”,”’”等字元做過濾;其次任何內容寫到頁面之前都必須加以encode,避免不小心把html tag 弄出來。這一個層面做好,至少可以堵住超過一半的XSS 攻擊。

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

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

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

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

XSS與CSRF有什麼區別嗎?

XSS是獲取資訊,不需要提前知道其他使用者頁面的程式碼和資料包。CSRF是代替使用者完成指定的動作,需要知道其他使用者頁面的程式碼和資料包。

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

CSRF的防禦

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

Web Worker 和webSocket

worker主執行緒:

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

HTTP和HTTPS

HTTP協議通常承載於TCP協議之上,在HTTPTCP之間新增一個安全協議層(SSLTSL),這個時候,就成了我們常說的HTTPS。

預設HTTP的埠號為80,HTTPS的埠號為443。

為什麼HTTPS安全

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

對前端模組化的認識

AMD 是 RequireJS 在推廣過程中對模組定義的規範化產出。

CMD 是 SeaJS 在推廣過程中對模組定義的規範化產出。

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

AMD推薦的風格通過返回一個物件做為模組物件,CommonJS的風格通過對module.exportsexports的屬性賦值來達到暴露模組物件的目的。

CMD模組方式

Javascript垃圾回收方法

標記清除(mark and sweep)

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

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

引用計數(reference counting)

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

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

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

談談效能優化問題

程式碼層面:避免使用css表示式,避免使用高階選擇器,通配選擇器。

快取利用:快取Ajax,使用CDN,使用外部js和css檔案以便快取,新增Expires頭,服務端配置Etag,減少DNS查詢等

請求數量:合併樣式和指令碼,使用css圖片精靈,初始首屏之外的圖片資源按需載入,靜態資源延遲載入。

請求頻寬:壓縮檔案,開啟GZIP,

程式碼層面的優化

  • hash-table來優化查詢
  • 少用全域性變數
  • innerHTML代替DOM操作,減少DOM操作次數,優化javascript效能
  • setTimeout來避免頁面失去響應
  • 快取DOM節點查詢的結果
  • 避免使用CSS Expression
  • 避免全域性查詢
  • 避免使用with(with會建立自己的作用域,會增加作用域鏈長度)
  • 多個變數宣告合併
  • 避免圖片和iFrame等的空Src。空Src會重新載入當前頁面,影響速度和效率
  • 儘量避免寫在HTML標籤中寫Style屬性

移動端效能優化

  • 儘量使用css3動畫,開啟硬體加速。
  • 適當使用touch事件代替click事件。
  • 避免使用css3漸變陰影效果。
  • 可以用transform: translateZ(0)來開啟硬體加速。
  • 不濫用Float。Float在渲染時計算量比較大,儘量減少使用
  • 不濫用Web字型。Web字型需要下載,解析,重繪當前頁面,儘量減少使用。
  • 合理使用requestAnimationFrame動畫代替setTimeout
  • 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有更高的優先順序。

ETag應用:

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

====第一次請求===

====第二次請求===

答案是同時使用,也就是說在完全匹配If-Modified-SinceIf-None-Match即檢查完修改時間和Etag之後,

伺服器才能返回304.(不要陷入到底使用誰的問題怪圈)

為什麼使用Etag請求頭?

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

棧和佇列的區別?

棧和堆的區別?

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

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

(1)在資料集之中,找一個基準點

(2)建立兩個陣列,分別儲存左邊和右邊的陣列

(3)利用遞迴進行下次比較

你覺得jQuery或zepto原始碼有哪些寫的好的地方

(答案僅供參考)

jquery原始碼封裝在一個匿名函式的自執行環境中,有助於防止變數的全域性汙染,然後通過傳入window物件引數,可以使window物件作為區域性變數使用,好處是當jquery中訪問window物件的時候,就不用將作用域鏈退回到頂層作用域了,從而可以更快的訪問window物件。同樣,傳入undefined引數,可以縮短查詢undefined時的作用域鏈。

jquery將一些原型屬性和方法封裝在了jquery.prototype中,為了縮短名稱,又賦值給了jquery.fn,這是很形象的寫法。

有一些陣列或物件的方法經常能使用到,jQuery將其儲存為區域性變數以提高訪問速度。

jquery實現的鏈式呼叫可以節約程式碼,所返回的都是同一個物件,可以提高程式碼效率。

ES6的瞭解

新增模板字串(為JavaScript提供了簡單的字串插值功能)、箭頭函式(操作符左邊為輸入的引數,而右邊則是進行的操作以及返回的值Inputs=>outputs。)、for-of(用來遍歷資料—例如陣列中的值。)arguments物件可被不定引數和預設引數完美代替。ES6promise物件納入規範,提供了原生的Promise物件。增加了letconst命令,用來宣告變數。增加了塊級作用域。let命令實際上就增加了塊級作用域。ES6規定,var命令和function命令宣告的全域性變數,屬於全域性物件的屬性;let命令、const命令、class命令宣告的全域性變數,不屬於全域性物件的屬性。。還有就是引入module模組的概念

js繼承方式及其優缺點

原型鏈繼承的缺點

借用建構函式(類式繼承)

組合式繼承

具體請看:JavaScript繼承方式詳解

關於Http 2.0 你知道多少?

HTTP/2引入了“服務端推(server push)”的概念,它允許服務端在客戶端需要資料之前就主動地將資料傳送到客戶端快取中,從而提高效能。

HTTP/2提供更多的加密支援

HTTP/2使用多路技術,允許多個訊息在一個連線上同時交差。

它增加了頭壓縮(header compression),因此即使非常小的請求,其請求和響應的header都只會佔用很小比例的頻寬。

defer和async

defer並行載入js檔案,會按照頁面上script標籤的順序執行 async並行載入js檔案,下載完成立即執行,不會按照頁面上script標籤的順序執行

談談浮動和清除浮動

浮動的框可以向左或向右移動,直到他的外邊緣碰到包含框或另一個浮動框的邊框為止。由於浮動框不在文件的普通流中,所以文件的普通流的塊框表現得就像浮動框不存在一樣。浮動的塊框會漂浮在文件普通流的塊框上。

如何評價AngularJS和BackboneJS

backbone具有依賴性,依賴underscore.jsBackbone + Underscore + jQuery(or Zepto) 就比一個AngularJS 多出了2 次HTTP請求.

BackboneModel沒有與UI檢視資料繫結,而是需要在View中自行操作DOM來更新或讀取UI資料。AngularJS與此相反,Model直接與UI檢視繫結,Model與UI檢視的關係,通過directive封裝,AngularJS內建的通用directive,就能實現大部分操作了,也就是說,基本不必關心Model與UI檢視的關係,直接操作Model就行了,UI檢視自動更新。

AngularJSdirective,你輸入特定資料,他就能輸出相應UI檢視。是一個比較完善的前端MVW框架,包含模板,資料雙向繫結,路由,模組化,服務,依賴注入等所有功能,模板功能強大豐富,並且是宣告式的,自帶了豐富的 Angular 指令。

用過哪些設計模式?

工廠模式:

建構函式模式

使用建構函式的方法 ,即解決了重複例項化的問題 ,又解決了物件識別的問題,該模式與工廠模式的不同之處在於:

說說你對閉包的理解

使用閉包主要是為了設計私有的方法和變數。閉包的優點是可以避免全域性變數的汙染,缺點是閉包會常駐記憶體,會增大記憶體使用量,使用不當很容易造成記憶體洩露。在js中,函式即閉包,只有函式才會產生作用域的概念

閉包有三個特性:

1.函式巢狀函式

2.函式內部可以引用外部的引數和變數

3.引數和變數不會被垃圾回收機制回收

具體請看:詳解js閉包

請你談談Cookie的弊端

cookie雖然在持久儲存客戶端資料提供了方便,分擔了伺服器儲存的負擔,但還是有很多侷限性的。

第一:每個特定的域名下最多生成20個cookie

IEOpera 會清理近期最少使用的cookieFirefox會隨機清理cookie

cookie的最大大約為4096位元組,為了相容性,一般不能超過4095位元組。

IE 提供了一種儲存可以持久化使用者資料,叫做userdata,從IE5.0就開始支援。每個資料最多128K,每個域名下最多1M。這個持久化資料放在快取中,如果快取沒有清理,那麼會一直存在。

優點:極高的擴充套件性和可用性

缺點:

瀏覽器本地儲存

在較高版本的瀏覽器中,js提供了sessionStorageglobalStorage。在HTML5中提供了localStorage來取代globalStorage

html5中的Web Storage包括了兩種儲存方式:sessionStoragelocalStorage

sessionStorage用於本地儲存一個會話(session)中的資料,這些資料只有在同一個會話中的頁面才能訪問並且當會話結束後資料也隨之銷燬。因此sessionStorage不是一種持久化的本地儲存,僅僅是會話級別的儲存。

localStorage用於持久化的本地儲存,除非主動刪除資料,否則資料是永遠不會過期的。

web storage和cookie的區別

Web Storage的概念和cookie相似,區別是它是為了更大容量儲存設計的。Cookie的大小是受限的,並且每次你請求一個新的頁面的時候Cookie都會被髮送過去,這樣無形中浪費了頻寬,另外cookie還需要指定作用域,不可以跨域呼叫。

除此之外,Web Storage擁有setItem,getItem,removeItem,clear等方法,不像cookie需要前端開發者自己封裝setCookie,getCookie

但是cookie也是不可以或缺的:cookie的作用是與伺服器進行互動,作為HTTP規範的一部分而存在 ,而Web Storage僅僅是為了在本地“儲存”資料而生

瀏覽器的支援除了IE7及以下不支援外,其他標準瀏覽器都完全支援(ie及FF需在web伺服器裡執行),值得一提的是IE總是辦好事,例如IE7、IE6中的userData其實就是javascript本地儲存的解決方案。通過簡單的程式碼封裝可以統一到所有的瀏覽器都支援web storage

localStoragesessionStorage都具有相同的操作方法,例如setItem、getItemremoveItem

cookie 和session 的區別:

display:nonevisibility:hidden的區別?

CSS中link@import的區別是?

position:absolutefloat屬性的異同

  • 共同點:對內聯元素設定floatabsolute屬性,可以讓元素脫離文件流,並且可以設定其寬高。
  • 不同點:float仍會佔據位置,absolute會覆蓋文件流中的其他元素。

介紹一下box-sizing屬性?

box-sizing屬性主要用來控制元素的盒模型的解析模式。預設值是content-box

  • content-box:讓元素維持W3C的標準盒模型。元素的寬度/高度由border + padding + content的寬度/高度決定,設定width/height屬性指的是content部分的寬/高
  • border-box:讓元素維持IE傳統盒模型(IE6以下版本和IE6~7的怪異模式)。設定width/height屬性指的是border + padding + content

標準瀏覽器下,按照W3C規範對盒模型解析,一旦修改了元素的邊框或內距,就會影響元素的盒子尺寸,就不得不重新計算元素的盒子尺寸,從而影響整個頁面的佈局。

CSS 選擇符有哪些?哪些屬性可以繼承?優先順序演算法如何計算? CSS3新增偽類有那些?

優先順序為:

!important > id > class > tag

important 比 內聯優先順序高,但內聯比 id 要高

CSS3新增偽類舉例:

CSS3有哪些新特性?

CSS3中新增了一種盒模型計算方式:box-sizing。盒模型預設的值是content-box, 新增的值是padding-boxborder-box,幾種盒模型計算元素寬高的區別如下:

content-box(預設)

佈局所佔寬度Width:

佈局所佔高度Height:

padding-box

佈局所佔寬度Width:

佈局所佔高度Height:

border-box

佈局所佔寬度Width:

佈局所佔高度Height:

對BFC規範的理解?

說說你對語義化的理解?

Doctype作用? 嚴格模式與混雜模式如何區分?它們有何意義?

1)、<!DOCTYPE> 宣告位於文件中的最前面,處於 <html> 標籤之前。告知瀏覽器以何種模式來渲染文件。

2)、嚴格模式的排版和 JS 運作模式是 以該瀏覽器支援的最高標準執行。

3)、在混雜模式中,頁面以寬鬆的向後相容的方式顯示。模擬老式瀏覽器的行為以防止站點無法工作。

4)、DOCTYPE不存在或格式不正確會導致文件以混雜模式呈現。

你知道多少種Doctype文件型別?

HTML與XHTML——二者有什麼區別

常見相容性問題?

上下margin重合問題

解釋下浮動和它的工作原理?清除浮動的技巧

浮動元素引起的問題和解決辦法?

解決方法:

使用CSS中的clear:both;屬性來清除元素的浮動可解決2、3問題,對於問題1,新增如下樣式,給父元素新增clearfix樣式:

清除浮動的幾種方法:

DOM操作——怎樣新增、移除、移動、複製、建立和查詢節點。

1)建立新節點

2)新增、移除、替換、插入

3)查詢

html5有哪些新特性、移除了那些元素?如何處理HTML5新標籤的瀏覽器相容問題?如何區分 HTML 和 HTML5?

移除的元素

支援HTML5新標籤:

如何實現瀏覽器內多個標籤頁之間的通訊?

什麼是 FOUC(無樣式內容閃爍)?你如何來避免 FOUC?

null和undefined的區別?

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

當宣告的變數還未被初始化時,變數的預設值為undefined

null用來表示尚未存在的物件,常用來表示函式企圖返回一個不存在的物件。

undefined表示”缺少值”,就是此處應該有一個值,但是還沒有定義。典型用法是:

null表示”沒有物件”,即該處不應該有值。典型用法是:

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

js延遲載入的方式有哪些?

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

作用:動態改變某個類的某個方法的執行環境(執行上下文)。

區別參見:JavaScript學習總結(四)function函式部分

哪些操作會造成記憶體洩漏?

詳見:詳解js變數、作用域及記憶體

列舉IE 與其他瀏覽器不一樣的特性?

  • IE支援currentStyle,FIrefox使用getComputStyle
  • IE 使用innerText,Firefox使用textContent
  • 濾鏡方面:IE:filter:alpha(opacity= num);Firefox:-moz-opacity:num
  • 事件方面:IE:attachEvent:火狐是addEventListener
  • 滑鼠位置:IE是event.clientX;火狐是event.pageX
  • IE使用event.srcElement;Firefox使用event.target
  • IE中消除list的原點僅需margin:0即可達到最終效果;FIrefox需要設定margin:0;padding:0以及list-style:none
  • CSS圓角:ie7以下不支援圓角

WEB應用從伺服器主動推送Data到客戶端有那些方式?

Javascript資料推送

  • Commet:基於HTTP長連線的伺服器推送技術
  • 基於WebSocket的推送方案
  • SSE(Server-Send Event):伺服器推送資料新方式

對前端介面工程師這個職位是怎麼樣理解的?它的前景會怎麼樣?

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

詳情:從輸入 URL 到瀏覽器接收的過程中發生了什麼事情?

javascript物件的幾種建立方式

javascript繼承的6種方法

詳情:JavaScript繼承方式詳解

建立ajax的過程

詳情:JavaScript學習總結(七)Ajax和Http狀態字

非同步載入和延遲載入

ie各版本和chrome可以並行下載多少個資源

FlashAjax各自的優缺點,在使用中如何取捨?

  • Flash適合處理多媒體、向量圖形、訪問機器;對CSS、處理文字上不足,不容易被搜尋。

AjaxCSS、文字支援很好,支援搜尋;多媒體、向量圖形、機器訪問不足。

  • 共同點:與伺服器的無重新整理傳遞訊息、使用者離線和線上狀態、操作DOM

請解釋一下 JavaScript 的同源策略。

概念:同源策略是客戶端指令碼(尤其是Javascript)的重要的安全度量標準。它最早出自Netscape Navigator2.0,其目的是防止某個文件或指令碼從多個不同源裝載。

這裡的同源策略指的是:協議,域名,埠相同,同源策略是一種安全協議。

指一段指令碼只能讀取來自同一來源的視窗和文件的屬性。

為什麼要有同源限制?

我們舉例說明:比如一個黑客程式,他利用Iframe把真正的銀行登入頁面嵌到他的頁面上,當你使用真實的使用者名稱,密碼登入時,他的頁面就可以通過Javascript讀取到你的表單中input中的內容,這樣使用者名稱,密碼就輕鬆到手了。

缺點:

現在網站的JS 都會進行壓縮,一些檔案用了嚴格模式,而另一些沒有。這時這些本來是嚴格模式的檔案,被 merge 後,這個串就到了檔案的中間,不僅沒有指示嚴格模式,反而在壓縮後浪費了位元組。

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

事件、IE與火狐的事件機制有什麼區別? 如何阻止冒泡?

ajax的缺點和在IE下的問題?

詳情請見:JavaScript學習總結(七)Ajax和Http狀態字

ajax的缺點

IE快取問題

在IE瀏覽器下,如果請求的方法是GET,並且請求的URL不變,那麼這個請求的結果就會被快取。解決這個問題的辦法可以通過實時改變請求的URL,只要URL改變,就不會被快取,可以通過在URL末尾新增上隨機的時間戳引數('t'= + new Date().getTime())

或者:

Ajax請求的頁面歷史記錄狀態問題

可以通過錨點來記錄狀態,location.hash。讓瀏覽器記錄Ajax請求時頁面狀態的變化。

還可以通過HTML5history.pushState,來實現瀏覽器位址列的無重新整理改變

談談你對重構的理解

網站重構:在不改變外部行為的前提下,簡化結構、新增可讀性,而在網站前端保持一致的行為。也就是說是在不改變UI的情況下,對網站進行優化, 在擴充套件的同時保持一致的UI。

HTTP狀態碼

說說你對Promise的理解

依照 Promise/A+ 的定義,Promise 有四種狀態:

另外, fulfilledrejected 一起合稱 settled

Promise 物件用來進行延遲(deferred) 和非同步(asynchronous ) 計算。

Promise 的建構函式

構造一個 Promise,最基本的用法如下:

Promise 例項擁有 then 方法(具有 then 方法的物件,通常被稱為 thenable)。它的使用方法如下:

接收兩個函式作為引數,一個在 fulfilled 的時候被呼叫,一個在 rejected 的時候被呼叫,接收引數就是 future,onFulfilled 對應 resolve, onRejected 對應 reject

說說你對前端架構師的理解

負責前端團隊的管理及與其他團隊的協調工作,提升團隊成員能力和整體效率; 帶領團隊完成研發工具及平臺前端部分的設計、研發和維護; 帶領團隊進行前端領域前沿技術研究及新技術調研,保證團隊的技術領先 負責前端開發規範制定、功能模組化設計、公共元件搭建等工作,並組織培訓。

實現一個函式clone,可以對JavaScript中的5種主要的資料型別(包括Number、String、Object、Array、Boolean)進行值複製

說說嚴格模式的限制

嚴格模式主要有以下限制:

設立”嚴格模式”的目的,主要有以下幾個:

  • 消除Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行為;
  • 消除程式碼執行的一些不安全之處,保證程式碼執行的安全;
  • 提高編譯器效率,增加執行速度;
  • 為未來新版本的Javascript做好鋪墊。

注:經過測試IE6,7,8,9均不支援嚴格模式。

如何刪除一個cookie

1.將時間設為當前時間往前一點。

setDate()方法用於設定一個月的某一天。

2.expires的設定

<strong><em><b><i>標籤

說說你對AMD和Commonjs的理解

CommonJS是伺服器端模組的規範,Node.js採用了這個規範。CommonJS規範載入模組是同步的,也就是說,只有載入完成,才能執行後面的操作。AMD規範則是非同步載入模組,允許指定回撥函式。

AMD推薦的風格通過返回一個物件做為模組物件,CommonJS的風格通過對module.exportsexports的屬性賦值來達到暴露模組物件的目的。

詳情:也談webpack及其開發模式

document.write()的用法

document.write()方法可以用在兩個方面:頁面載入過程中用實時指令碼建立頁面內容,以及用延時指令碼建立本視窗或新視窗的內容。

document.write只能重繪整個頁面。innerHTML可以重繪頁面的一部分

編寫一個方法 求一個字串的位元組長度

假設:一個英文字元佔用一個位元組,一箇中文字元佔用兩個位元組

git fetch和git pull的區別

說說你對MVC和MVVM的理解

MVC

所有通訊都是單向的。

Angular它採用雙向繫結(data-binding):View的變動,自動反映在 ViewModel,反之亦然。

請解釋什麼是事件代理

事件代理(Event Delegation),又稱之為事件委託。是 JavaScript 中常用繫結事件的常用技巧。顧名思義,“事件代理”即是把原本需要繫結的事件委託給父元素,讓父元素擔當事件監聽的職務。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好處是可以提高效能。

attribute和property的區別是什麼?

attributedom元素在文件中作為html標籤擁有的屬性;

property就是dom元素在js中作為物件擁有的屬性。

所以:

對於html的標準屬性來說,attributeproperty是同步的,是會自動更新的,

但是對於自定義的屬性來說,他們是不同步的,

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

  • 應用層:應用層、表示層、會話層(從上往下)(HTTP、FTP、SMTP、DNS
  • 傳輸層(TCPUDP
  • 網路層(IP
  • 物理和資料鏈路層(乙太網)

每一層的作用如下:

各種協議

ICMP協議: 因特網控制報文協議。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制訊息。 TFTP協議: 是TCP/IP協議族中的一個用來在客戶機與伺服器之間進行簡單檔案傳輸的協議,提供不復雜、開銷不大的檔案傳輸服務。 HTTP協議: 超文字傳輸協議,是一個屬於應用層的物件導向的協議,由於其簡捷、快速的方式,適用於分散式超媒體資訊系統。DHCP協議: 動態主機配置協議,是一種讓系統得以連線到網路上,並獲取所需要的配置引數手段。

說說mongoDB和MySQL的區別

MySQL是傳統的關係型資料庫,MongoDB則是非關係型資料庫

mongodbBSON結構(二進位制)進行儲存,對海量資料儲存有著很明顯的優勢。

對比傳統關係型資料庫,NoSQL有著非常顯著的效能和擴充套件性優勢,與關係型資料庫相比,MongoDB的優點有: ①弱一致性(最終一致),更能保證使用者的訪問速度: ②文件結構的儲存方式,能夠更便捷的獲取資料。

講講304快取的原理

伺服器首先產生ETag,伺服器可在稍後使用它來判斷頁面是否已經被修改。本質上,客戶端通過將該記號傳回伺服器要求伺服器驗證其(客戶端)快取。

304是HTTP狀態碼,伺服器用來標識這個檔案沒修改,不返回內容,瀏覽器在接收到個狀態碼後,會使用瀏覽器已快取的檔案

客戶端請求一個頁面(A)。 伺服器返回頁面A,並在給A加上一個ETag。 客戶端展現該頁面,並將頁面連同ETag一起快取。 客戶再次請求頁面A,並將上次請求時伺服器返回的ETag一起傳遞給伺服器。 伺服器檢查該ETag,並判斷出該頁面自上次客戶端請求之後還未被修改,直接返回響應304(未修改——Not Modified)和一個空的響應體。

什麼樣的前端程式碼是好的

高複用低耦合,這樣檔案小,好維護,而且好擴充套件。

程式碼題

相關文章