前端面试题整理(js)
1、HTTP協議的狀態消息都有哪些?
HTTP狀態碼是什么:
Web服務器用來告訴客戶端,發生了什么事。
狀態碼分類:
1**:信息提示。請求收到,繼續處理
2**:成功。操作成功收到,分析、接受
3**:重定向。完成此請求必須進一步處理
4**:客戶端錯誤。請求包含一個錯誤語法或不能完成
5**:服務器錯誤。服務器執行一個完全有效請求失敗
狀態碼詳解:
100(繼續):服務器收到的請求不完整,但服務器沒有拒絕請求,客戶端應重新發送一個完整的請求。
101(切換協議):服務器改用別的協議了
200(成功):服務器已成功處理了請求
201(已創建):請求成功并且服務器創建了新的資源
202(已接受):?服務器已接受請求,但尚未處理
203 (非授權信息) :服務器已成功處理了請求,但返回的信息可能來自另一來源。
204 (無內容): 服務器成功處理了請求,但沒有返回任何內容。
205 (重置內容): 服務器成功處理了請求,但沒有返回任何內容。
206 (部分內容): 服務器成功處理了部分 GET 請求。
300 (多種選擇): 針對請求,服務器可執行多種操作。 服務器可根據請求者 (user agent) 選擇一項操作,或提供操作列表供請求者選擇。
301 (永久移動): 請求的網頁已永久移動到新位置。 服務器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
302 (臨時移動): 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。
303 (查看其他位置): 請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,服務器返回此代碼。
304 (未修改): 自從上次請求后,請求的網頁未修改過。 服務器返回此響應時,不會返回網頁內容。
305 (使用代理): 請求者只能使用代理訪問請求的網頁。 如果服務器返回此響應,還表示請求者應使用代理。
307 (臨時重定向): 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。
400 (錯誤請求): 服務器不理解請求的語法。?
401 (未授權): 請求要求身份驗證。 對于需要登錄的網頁,服務器可能返回此響應。
403 (禁止): 服務器拒絕請求。
404 (未找到): 服務器找不到請求的網頁。
405 (方法禁用): 禁用請求中指定的方法。
406 (不接受): 無法使用請求的內容特性響應請求的網頁。
407 (需要代理授權): 此狀態代碼與 401(未授權)類似,但指定請求者應當授權使用代理。
408 (請求超時): 服務器等候請求時發生超時。
409 (沖突): 服務器在完成請求時發生沖突。 服務器必須在響應中包含有關沖突的信息。
410 (已刪除): 如果請求的資源已永久刪除,服務器就會返回此響應。
411 (需要有效長度): 服務器不接受不含有效內容長度標頭字段的請求。
412 (未滿足前提條件): 服務器未滿足請求者在請求中設置的其中一個前提條件。
413 (請求實體過大): 服務器無法處理請求,因為請求實體過大,超出服務器的處理能力。
414 (請求的 URI 過長): 請求的 URI(通常為網址)過長,服務器無法處理。
415 (不支持的媒體類型): 請求的格式不受請求頁面的支持。
416 (請求范圍不符合要求): 如果頁面無法提供請求的范圍,則服務器會返回此狀態代碼。
417 (未滿足期望值): 服務器未滿足"期望"請求標頭字段的要求。
500 (服務器內部錯誤) 服務器遇到錯誤,無法完成請求。?
501 (尚未實施) 服務器不具備完成請求的功能。 例如,服務器無法識別請求方法時可能會返回此代碼。
502 (錯誤網關) 服務器作為網關或代理,從上游服務器收到無效響應。
503 (服務不可用) 服務器目前無法使用(由于超載或停機維護)。 通常,這只是暫時狀態。
504 (網關超時) 服務器作為網關或代理,但是沒有及時從上游服務器收到請求。
505 (HTTP 版本不受支持) 服務器不支持請求中所用的 HTTP 協議版本。
常見的狀態碼(只要記住這些就可以了):
200——服務器已成功處理了請求
301——請求的網頁已永久移動到新位置。 服務器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
404——服務器找不到請求的網頁。
500——服務器遇到錯誤,無法完成請求。
503——服務器目前無法使用(由于超載或停機維護)。 通常,這只是暫時狀態。
504——服務器作為網關或代理,但是沒有及時從上游服務器收到請求。
2、AJAX是什么? AJAX的交互模型(流程)? AJAX跨域的解決辦法?
AJAX = 異步 JavaScript 和 XML(Asynchronous JavaScript and XML)。簡短地說,在不重載整個網頁的情況下,AJAX 通過后臺加載數據,并在網頁上進行顯示。
AJAX的工作原理相當于在用戶和服務器之間加了一個中間層,使用戶操作與服務器相應異步化。并不是所有的用戶請求都提交給服務器,像一些數據驗證和數據處理等都交給AJAX引擎自己來做,只有確定需要從服務器讀取新數據時再由AJAX引擎代為向服務器提交請求。
跨域問題,可以實用jquery的jsonp來處理:
$(document).ready(function(){var url='http://localhost:8080/WorkGroupManagment/open/getGroupById"+"?id=1&callback=?';$.ajax({url:url,dataType:'jsonp',//重點processData: false, type:'get',success:function(data){alert(data.name);},error:function(XMLHttpRequest, textStatus, errorThrown) {alert(XMLHttpRequest.status);alert(XMLHttpRequest.readyState);alert(textStatus);}});});?
3、同步和異步的區別??
舉個例子:普通B/S模式(同步)——AJAX技術(異步)
同步:提交請求->等待服務器處理->處理完畢返回 這個期間客戶端瀏覽器不能干任何事
異步: 請求通過事件觸發->服務器處理(這是瀏覽器仍然可以作其他事情)->處理完畢
?
4、簡述JavaScript封裝。
JS封裝就是盡量把使用的方式簡單化,內部邏輯和使用解耦。通俗的說就是使用的時候只需要知道參數和返回值,其他條件盡量不要使用人員進行設置。
函數形式:
function taojiaqu(a,b){//內部對a,b進行處理 }對象形式:
function taojiaqu(a,b){this.x=a;this.y=b; } var tjq = new taojiaqu(1,2);//通過面向對象的方式 alert(tjq.x)閉包形式:
function tjq(a,b){var k = 1;return function tt(){k++;return k;} } var u = kk(1,2); u();//閉包實現累加 k=2 u();//閉包實現累加 k=3 alert(u());//彈出4?
5、JavaScript繼承。
對象冒充:
function tjq(username){this.username = username; this.hello = function(){ alert(this.username); } } function taojiaqu(username,password){ //通過以下3行實現將tjq的屬性和方法追加到taojiaqu中,從而實現繼承 //1:this.method是作為一個臨時的屬性,并且指向tjq所指向的對象, //2:執行this.method方法,即執行tjq所指向的對象函數 //3:銷毀this.method屬性,即此時taojiaqu就已經擁有了tjq的所有屬性和方法 this.method = tjq; this.method(username);//最關鍵的一行 delete this.method; this.password = password; this.world = function(){ alert(this.password); } } var parent = new tjq("tjq"); var child = new taojiaqu("taojiaqu","123456"); parent.hello(); //彈出tjq child.hello(); //彈出taojiaqu child.world(); //彈出123456call()方法方式:
apply方法方式:
function tjq(username){this.username = username; this.hello = function(){ alert(this.username); } } function taojiaqu(username,password){ //語法:apply([thisObj[,argArray]]) //定義:應用某一對象的一個方法,用另一個對象替換當前對象。//跟call基本一個意思,只是第二個參數必須是數組tjq.apply(this,[username]);this.password = password;this.world = function(){ alert(this.password); } } var parent = new tjq("tjq"); var child = new taojiaqu("taojiaqu","123456"); parent.hello(); //彈出tjq child.hello(); //彈出taojiaqu child.world(); //彈出123456原型鏈方式:
function tjq(){} tjq.prototype.username='taojiaqu'; tjq.prototype.sayUsername=function(){alert(this.username); } function taojiaqu(){} taojiaqu.prototype=new tjq();//將tjq中將所有通過prototype追加的屬性和方法都追加到taojiaqu,從而實現了繼承 taojiaqu.prototype.password='123456'; taojiaqu.prototype.sayPassword=function(){alert(this.password); } var parent = new taojiaqu(); parent.sayUsername(); //彈出taojiaqu parent.sayPassword(); //彈出123456混合方式(原型鏈+call()):
function tjq(username){this.username=username; } tjq.prototype.sayUsername=function(){alert(this.username); } function taojiaqu(username){tjq.call(this,username);//將tjq屬性繼承過來this.password='123456';this.sayPassword=function(){alert(this.password);} } taojiaqu.prototype=new tjq();//將tjq原型鏈方法繼承過來 var parent = new taojiaqu('taojiaqu'); parent.sayUsername(); //彈出taojiaqu parent.sayPassword(); //彈出123456?
6、什么是閉包?
官方對閉包的解釋是:一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。閉包的特點:
1. 作為一個函數變量的一個引用,當函數返回時,其處于激活狀態。 2. 一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區。 簡單的說,javascript允許使用內部函數---即函數定義和函數表達式位于另一個函數的函數體內。而且,這些內部函數可以訪問它們所在的外部函數中聲明的所有局部變量、參數和聲明的其他內部函數。當其中一個這樣的內部函數在包含它們的外部函數之外被調用時,就會形成閉包。 以下兩端代碼都能依次點擊彈出0,1,2,3... <!doctype html> <html lang="en"> <head><meta charset="UTF-8"><title>js閉包</title><style>*{margin: 0;padding: 0;}li{line-height: 30px;background: red;border-bottom: 1px solid #000}</style> </head> <body><ul><li>1</li><li>2</li><li>3</li><li>4</li></ul> </body> </html> <script>window.onload=function(){var olis=document.getElementsByTagName('li');for(var i=0;i<olis.length;i++){eventClick(olis,i);}}function eventClick(obj,i){return obj[i].οnclick=function(){alert(i);}}</script> <!doctype html> <html lang="en"> <head><meta charset="UTF-8"><title>js閉包</title><style>*{margin: 0;padding: 0;}li{line-height: 30px;background: red;border-bottom: 1px solid #000}</style> </head> <body><ul><li>1</li><li>2</li><li>3</li><li>4</li></ul> </body> </html> <script>window.onload=function(){var olis=document.getElementsByTagName('li');for(var i=0;i<olis.length;i++){(function(i){olis[i].onclick=function(){alert(i);};})(i);}} </script>?由于閉包可以把變量參數存于內存當中,即使你跳轉頁面也還會存在,這就引發了內存泄漏,除非你關閉瀏覽器,它才會自動釋放。
轉載于:https://www.cnblogs.com/chenrf/p/4895870.html
總結
以上是生活随笔為你收集整理的前端面试题整理(js)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端面试题整理(css)
- 下一篇: 2017年html5行业报告,云适配发布