前端面试题整理(js)
1、HTTP協(xié)議的狀態(tài)消息都有哪些?
HTTP狀態(tài)碼是什么:
Web服務(wù)器用來告訴客戶端,發(fā)生了什么事。
狀態(tài)碼分類:
1**:信息提示。請求收到,繼續(xù)處理
2**:成功。操作成功收到,分析、接受
3**:重定向。完成此請求必須進一步處理
4**:客戶端錯誤。請求包含一個錯誤語法或不能完成
5**:服務(wù)器錯誤。服務(wù)器執(zhí)行一個完全有效請求失敗
狀態(tài)碼詳解:
100(繼續(xù)):服務(wù)器收到的請求不完整,但服務(wù)器沒有拒絕請求,客戶端應(yīng)重新發(fā)送一個完整的請求。
101(切換協(xié)議):服務(wù)器改用別的協(xié)議了
200(成功):服務(wù)器已成功處理了請求
201(已創(chuàng)建):請求成功并且服務(wù)器創(chuàng)建了新的資源
202(已接受):?服務(wù)器已接受請求,但尚未處理
203 (非授權(quán)信息) :服務(wù)器已成功處理了請求,但返回的信息可能來自另一來源。
204 (無內(nèi)容): 服務(wù)器成功處理了請求,但沒有返回任何內(nèi)容。
205 (重置內(nèi)容): 服務(wù)器成功處理了請求,但沒有返回任何內(nèi)容。
206 (部分內(nèi)容): 服務(wù)器成功處理了部分 GET 請求。
300 (多種選擇): 針對請求,服務(wù)器可執(zhí)行多種操作。 服務(wù)器可根據(jù)請求者 (user agent) 選擇一項操作,或提供操作列表供請求者選擇。
301 (永久移動): 請求的網(wǎng)頁已永久移動到新位置。 服務(wù)器返回此響應(yīng)(對 GET 或 HEAD 請求的響應(yīng))時,會自動將請求者轉(zhuǎn)到新位置。
302 (臨時移動): 服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來進行以后的請求。
303 (查看其他位置): 請求者應(yīng)當(dāng)對不同的位置使用單獨的 GET 請求來檢索響應(yīng)時,服務(wù)器返回此代碼。
304 (未修改): 自從上次請求后,請求的網(wǎng)頁未修改過。 服務(wù)器返回此響應(yīng)時,不會返回網(wǎng)頁內(nèi)容。
305 (使用代理): 請求者只能使用代理訪問請求的網(wǎng)頁。 如果服務(wù)器返回此響應(yīng),還表示請求者應(yīng)使用代理。
307 (臨時重定向): 服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來進行以后的請求。
400 (錯誤請求): 服務(wù)器不理解請求的語法。?
401 (未授權(quán)): 請求要求身份驗證。 對于需要登錄的網(wǎng)頁,服務(wù)器可能返回此響應(yīng)。
403 (禁止): 服務(wù)器拒絕請求。
404 (未找到): 服務(wù)器找不到請求的網(wǎng)頁。
405 (方法禁用): 禁用請求中指定的方法。
406 (不接受): 無法使用請求的內(nèi)容特性響應(yīng)請求的網(wǎng)頁。
407 (需要代理授權(quán)): 此狀態(tài)代碼與 401(未授權(quán))類似,但指定請求者應(yīng)當(dāng)授權(quán)使用代理。
408 (請求超時): 服務(wù)器等候請求時發(fā)生超時。
409 (沖突): 服務(wù)器在完成請求時發(fā)生沖突。 服務(wù)器必須在響應(yīng)中包含有關(guān)沖突的信息。
410 (已刪除): 如果請求的資源已永久刪除,服務(wù)器就會返回此響應(yīng)。
411 (需要有效長度): 服務(wù)器不接受不含有效內(nèi)容長度標(biāo)頭字段的請求。
412 (未滿足前提條件): 服務(wù)器未滿足請求者在請求中設(shè)置的其中一個前提條件。
413 (請求實體過大): 服務(wù)器無法處理請求,因為請求實體過大,超出服務(wù)器的處理能力。
414 (請求的 URI 過長): 請求的 URI(通常為網(wǎng)址)過長,服務(wù)器無法處理。
415 (不支持的媒體類型): 請求的格式不受請求頁面的支持。
416 (請求范圍不符合要求): 如果頁面無法提供請求的范圍,則服務(wù)器會返回此狀態(tài)代碼。
417 (未滿足期望值): 服務(wù)器未滿足"期望"請求標(biāo)頭字段的要求。
500 (服務(wù)器內(nèi)部錯誤) 服務(wù)器遇到錯誤,無法完成請求。?
501 (尚未實施) 服務(wù)器不具備完成請求的功能。 例如,服務(wù)器無法識別請求方法時可能會返回此代碼。
502 (錯誤網(wǎng)關(guān)) 服務(wù)器作為網(wǎng)關(guān)或代理,從上游服務(wù)器收到無效響應(yīng)。
503 (服務(wù)不可用) 服務(wù)器目前無法使用(由于超載或停機維護)。 通常,這只是暫時狀態(tài)。
504 (網(wǎng)關(guān)超時) 服務(wù)器作為網(wǎng)關(guān)或代理,但是沒有及時從上游服務(wù)器收到請求。
505 (HTTP 版本不受支持) 服務(wù)器不支持請求中所用的 HTTP 協(xié)議版本。
常見的狀態(tài)碼(只要記住這些就可以了):
200——服務(wù)器已成功處理了請求
301——請求的網(wǎng)頁已永久移動到新位置。 服務(wù)器返回此響應(yīng)(對 GET 或 HEAD 請求的響應(yīng))時,會自動將請求者轉(zhuǎn)到新位置。
404——服務(wù)器找不到請求的網(wǎng)頁。
500——服務(wù)器遇到錯誤,無法完成請求。
503——服務(wù)器目前無法使用(由于超載或停機維護)。 通常,這只是暫時狀態(tài)。
504——服務(wù)器作為網(wǎng)關(guān)或代理,但是沒有及時從上游服務(wù)器收到請求。
2、AJAX是什么? AJAX的交互模型(流程)? AJAX跨域的解決辦法?
AJAX = 異步 JavaScript 和 XML(Asynchronous JavaScript and XML)。簡短地說,在不重載整個網(wǎng)頁的情況下,AJAX 通過后臺加載數(shù)據(jù),并在網(wǎng)頁上進行顯示。
AJAX的工作原理相當(dāng)于在用戶和服務(wù)器之間加了一個中間層,使用戶操作與服務(wù)器相應(yīng)異步化。并不是所有的用戶請求都提交給服務(wù)器,像一些數(shù)據(jù)驗證和數(shù)據(jù)處理等都交給AJAX引擎自己來做,只有確定需要從服務(wù)器讀取新數(shù)據(jù)時再由AJAX引擎代為向服務(wù)器提交請求。
跨域問題,可以實用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、同步和異步的區(qū)別??
舉個例子:普通B/S模式(同步)——AJAX技術(shù)(異步)
同步:提交請求->等待服務(wù)器處理->處理完畢返回 這個期間客戶端瀏覽器不能干任何事
異步: 請求通過事件觸發(fā)->服務(wù)器處理(這是瀏覽器仍然可以作其他事情)->處理完畢
?
4、簡述JavaScript封裝。
JS封裝就是盡量把使用的方式簡單化,內(nèi)部邏輯和使用解耦。通俗的說就是使用的時候只需要知道參數(shù)和返回值,其他條件盡量不要使用人員進行設(shè)置。
函數(shù)形式:
function taojiaqu(a,b){//內(nèi)部對a,b進行處理 }對象形式:
function taojiaqu(a,b){this.x=a;this.y=b; } var tjq = new taojiaqu(1,2);//通過面向?qū)ο蟮姆绞?/span> alert(tjq.x)閉包形式:
function tjq(a,b){var k = 1;return function tt(){k++;return k;} } var u = kk(1,2); u();//閉包實現(xiàn)累加 k=2 u();//閉包實現(xiàn)累加 k=3 alert(u());//彈出4?
5、JavaScript繼承。
對象冒充:
function tjq(username){this.username = username; this.hello = function(){ alert(this.username); } } function taojiaqu(username,password){ //通過以下3行實現(xiàn)將tjq的屬性和方法追加到taojiaqu中,從而實現(xiàn)繼承 //1:this.method是作為一個臨時的屬性,并且指向tjq所指向的對象, //2:執(zhí)行this.method方法,即執(zhí)行tjq所指向的對象函數(shù) //3:銷毀this.method屬性,即此時taojiaqu就已經(jīng)擁有了tjq的所有屬性和方法 this.method = tjq; this.method(username);//最關(guān)鍵的一行 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]]) //定義:應(yīng)用某一對象的一個方法,用另一個對象替換當(dāng)前對象。//跟call基本一個意思,只是第二個參數(shù)必須是數(shù)組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,從而實現(xiàn)了繼承 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、什么是閉包?
官方對閉包的解釋是:一個擁有許多變量和綁定了這些變量的環(huán)境的表達式(通常是一個函數(shù)),因而這些變量也是該表達式的一部分。閉包的特點:
1. 作為一個函數(shù)變量的一個引用,當(dāng)函數(shù)返回時,其處于激活狀態(tài)。 2. 一個閉包就是當(dāng)一個函數(shù)返回時,一個沒有釋放資源的棧區(qū)。 簡單的說,javascript允許使用內(nèi)部函數(shù)---即函數(shù)定義和函數(shù)表達式位于另一個函數(shù)的函數(shù)體內(nèi)。而且,這些內(nèi)部函數(shù)可以訪問它們所在的外部函數(shù)中聲明的所有局部變量、參數(shù)和聲明的其他內(nèi)部函數(shù)。當(dāng)其中一個這樣的內(nèi)部函數(shù)在包含它們的外部函數(shù)之外被調(diào)用時,就會形成閉包。 以下兩端代碼都能依次點擊彈出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>?由于閉包可以把變量參數(shù)存于內(nèi)存當(dāng)中,即使你跳轉(zhuǎn)頁面也還會存在,這就引發(fā)了內(nèi)存泄漏,除非你關(guān)閉瀏覽器,它才會自動釋放。
轉(zhuǎn)載于:https://www.cnblogs.com/chenrf/p/4895870.html
總結(jié)
以上是生活随笔為你收集整理的前端面试题整理(js)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端面试题整理(css)
- 下一篇: 【原创】有关Silverlight中“D