整理的一些常见问题
1、 什么是閉包?閉包有什么作用?
var a=1; function (){a++;return a; }復(fù)制代碼一個變量,一個函數(shù),在函數(shù)里可以訪問到變量,這就叫閉包,即如果一個函數(shù)引用了除了它自身內(nèi)部變量外的變量,這個外部變量和這個函數(shù)就形成了一個閉包。
閉包的作用:
從外部讀取函數(shù)內(nèi)部變量,讓這些變量始終保持在內(nèi)存中:
閉包使內(nèi)部變量記住上一次的運(yùn)算結(jié)果,不會因為沒有被直接引用而被瀏覽器的垃圾回收機(jī)制回收。
同時閉包也可以用來封裝對象的私有屬性和方法:
function fn1(n){return function fn2(){return n++;} } var fn3=fn1(1); fn3()//1 var fn4=fn1(2); fn4()//2 //fn3和fn4互不影響,各自返回不同的數(shù)值復(fù)制代碼2、call、apply、bind 的用法分別是什么?
相同點:
接受的第一個參數(shù)都是this,都能改變this 的指向。
區(qū)別:
call可以接受第二個,第三個,第N個參數(shù),apply接受的第二個參數(shù)是一個數(shù)組,bind和call可以接受的參數(shù)一樣,但是bind的返回值是一個函數(shù),也就是就算傳參數(shù)進(jìn)去也不會立即執(zhí)行,還需要再次調(diào)用執(zhí)行一次函數(shù)才算真正的執(zhí)行。
3、幾個常用的HTTP狀態(tài)碼
狀態(tài)碼200表示請求成功
狀態(tài)碼202表示服務(wù)器成功接收請求
狀態(tài)碼301表示被請求的資源已經(jīng)永久移動到新位置
狀態(tài)碼302表示被請求的資源暫時不可以訪問,以后可以再訪問
狀態(tài)碼400表示請求報文中存在語法錯誤
狀態(tài)碼404表示請求失敗,請求所希望得到的資源沒有在服務(wù)器上找到
狀態(tài)碼500表示服務(wù)器錯誤
狀態(tài)碼502表示作為網(wǎng)關(guān)或代理工作的服務(wù)器嘗試執(zhí)行請求時,從上游服務(wù)器得到無效的響應(yīng)
4、寫出一個http請求和響應(yīng)
HTTP請求常見格式,分為四部分:
第一部分:請求方式(get/post)? 路徑(/path)? 協(xié)議/版本號(HTTP/1.1)
第二部分:鍵值對(key:value)
第三部分:回車符
第四部分:請求的數(shù)據(jù)
1 POST /path HTTP/1.1 2 Host:www.baidu.com 2 Content-Length: 24 2 Content-Type: application/x-www-form-urlencoded 3 4 username=ff&password=123復(fù)制代碼HTTP響應(yīng)常見格式,分為四部分:
第一部分:協(xié)議/版本號(HTTP/1.1) 狀態(tài)碼? ?狀態(tài)碼解釋?
第二部分:鍵值對(key:value)
第三部分:回車符
第四部分:響應(yīng)數(shù)據(jù)(根據(jù)第二部分的Content-Type決定該部分的內(nèi)容格式)
1 HTTP/1.1 200 ok 2 Content-Length: 200 2 Content-Type: text/html 3 4 <html>...</html>復(fù)制代碼5、一個頁面從輸入 URL 到頁面加載顯示完成,這個過程中都發(fā)生了什么?
5-1.DNS解析:瀏覽器根據(jù)URL中的域名查找對應(yīng)的IP地址。
5-2.TCP連接:瀏覽器根據(jù)IP地址向服務(wù)器發(fā)起TCP連接,產(chǎn)生三次握手:
(1)瀏覽器向服務(wù)器發(fā)起連接請求
(2)服務(wù)器接到請求,回復(fù)同意連接
(3)瀏覽器接到服務(wù)器返回的確認(rèn)連接信息,再次確認(rèn),正式建立連接。
5-3.發(fā)送http請求:建立連接后,瀏覽器發(fā)送http請求,包括請求行,請求頭,請求數(shù)據(jù)內(nèi)容
5-4.服務(wù)器處理請求并返回響應(yīng)內(nèi)容
5-5.瀏覽器渲染頁面:瀏覽器收到響應(yīng)開始解析渲染頁面,先解析html構(gòu)建DOM樹,再解析? css構(gòu)建規(guī)則樹,根據(jù)樹然后繪制頁面。
5-6.關(guān)閉連接或者繼續(xù)保持連接
6、如何實現(xiàn)數(shù)組去重?
假設(shè)有數(shù)組 array = [1,5,2,3,4,2,3,1,3,4]
你要寫一個函數(shù) unique,使得
unique(array) 的值為 [1,5,2,3,4]
也就是把重復(fù)的值都去掉,只保留不重復(fù)的值。
要求:
ES5:
var array = [1,5,2,3,4,2,3,1,3,4]; function unique(arr){var newArray = [];var hasharr={};for (var i = 0; i < arr.length; i++) {if (hasharr[arr[i] ]===undefined) {newArray.push(arr[i]);hasharr[arr[i]]=1;}}return newArray; } unique(array); 復(fù)制代碼ES6:
var array = [1,5,2,3,4,2,3,1,3,4]; function unique(arr){return Array.from(new Set(arr)); } unique(array);復(fù)制代碼7、JSON 和 JavaScript 是什么關(guān)系?JSON 和 JavaScript 的區(qū)別有哪些?
關(guān)系:JSON 是一門借鑒 JavaScript 的語言,同時也是一種數(shù)據(jù)交互格式,JSON 是 JavaScript 的子集(或者說 JSON 只借鑒了一部分 JavaScript 語法,而且沒有新增任何原創(chuàng)的語法)
區(qū)別:JSON 不支持函數(shù)、undefined、變量、引用、單引號字符串、對象的key不支持單引號也不支持不加引號、沒有內(nèi)置的 Date、Math、RegExp 等。
而 JavaScript 全都支持。
8、什么是 JSONP?
JSONP是一種跨域請求數(shù)據(jù)方式,原理是動態(tài)創(chuàng)建script標(biāo)簽,利用script發(fā)送請求不受同源策略限制的特性,實現(xiàn)的過程是:
1.請求方即瀏覽器在頁面創(chuàng)建一個script標(biāo)簽指向響應(yīng)地址,同時傳遞一個查詢參數(shù)callback=函數(shù)名,這個函數(shù)里可以自己定義處理參數(shù)的過程
2.響應(yīng)方根據(jù)前端頁面?zhèn)鬟^來的查詢參數(shù),創(chuàng)建一個形如:函數(shù)名.call('undefined',{key:value,key:value,......})或者 函數(shù)名({key:value,key:value,......})這樣的響應(yīng)
3.瀏覽器收到響應(yīng),調(diào)用函數(shù),按照自己定義的方式來處理接收到的數(shù)據(jù)
9、JSONP 為什么不支持 POST
因為JSONP的使用原理是動態(tài)創(chuàng)建script標(biāo)簽,利用script發(fā)送請求不受同源策略限制的特性來實現(xiàn)跨域請求數(shù)據(jù),而動態(tài)創(chuàng)建的script標(biāo)簽只能發(fā)送get請求,不支持post。
10、有哪些可以發(fā)請求的標(biāo)簽?
form可以發(fā)post和get請求,會刷新或新打開頁面 。a只能發(fā)get,會刷新或新打開頁面。 img只能發(fā)get,只能以圖片形式顯示。 link只能發(fā)get,必須放在頁面里才能發(fā),只能以css或者favicon形式展示 。script只能發(fā)get,必須放在頁面里,但是只能以腳本的形式運(yùn)行。
11、什么是前端MVC?
Model(模型)-- View(視圖)--Controller(控制器)
MVC 就是一種有規(guī)律的代碼規(guī)范,把代碼按照三層的結(jié)構(gòu)進(jìn)行梳理,更清晰易懂,具體就是:
Model 數(shù)據(jù)管理,包括數(shù)據(jù)邏輯、數(shù)據(jù)請求、數(shù)據(jù)存儲等功能。前端 Model 主要負(fù)責(zé) AJAX 請求或者 LocalStorage 存儲
View 負(fù)責(zé)用戶界面,前端 View 主要負(fù)責(zé) HTML 渲染。
Controller 負(fù)責(zé)處理 View 的事件,并更新 Model;也負(fù)責(zé)監(jiān)聽 Model 的變化,并更新 View,Controller 控制其他的所有流程。
流程:
用戶在視圖層進(jìn)行操作,然后控制器監(jiān)聽到視圖層的操作,向模型層請求調(diào)用數(shù)據(jù),模型層收到請求向服務(wù)器發(fā)出請求調(diào)用數(shù)據(jù),服務(wù)器把數(shù)據(jù)響應(yīng)給模型層,模型層再把數(shù)據(jù)返回給控制器,控制器更新視圖層數(shù)據(jù)。
12、在 ES5 中如何用函數(shù)模擬一個類?
function Person(options){// 此處可以添加不同的私有屬性this.name=namethis.age=age... } // 此處設(shè)置Person類的公有屬性 Person.prototype.walk=function(){console.log('walk')} Person.prototype.gender="woman"var person1=new Person({name:'hi',age:'18'})復(fù)制代碼13、怎樣使用Promise?
window.myFunction=function(options){return new Promise(function(resolve,reject){if(success){resolve.call(this,responseText)}else{reject.call(this,errorText)}}) }window.myFunction(options).then((responseText)=>console.log(responseText),//resolve(errorText)=>console.log(errorText)//reject )復(fù)制代碼14、請使用原生 JS 寫出一個 AJAX 請求(代碼中必須出現(xiàn) XMLHttpRequest)
let request=new XMLHttpRequest(); request.open('GET','/path'); request.send(); request.onreadystatechange=function(){if(request.readyState===4){if(request.status>=200&&request.status<300){console.log('success');}else if(request.status>=400){console.log('failed');}} }復(fù)制代碼15、關(guān)于Cookie、Session和Localstorage
cookie和session的關(guān)系 :一般來說,session是基于cookie實現(xiàn)的??
cookie和Localstorage的區(qū)別 :cookie每次都會被帶給服務(wù)器,帶給每個頁面,但是localstorage不會,跟http無關(guān),只被存儲在本地 cookie一般最大4K左右,localstorage最大5MB 跟瀏覽器有關(guān)?
Localstorage和sessionStorage的區(qū)別 :sessionStorage在用戶關(guān)閉頁面以后即Session(會話)結(jié)束以后就會失效,Localstorage只要用戶不主動清理緩存就會永久有效?
expries和cache-control區(qū)別:expries是以前的用法,expires表示什么時候過期,cache-control表示過多久過期,expires表示的時間是用戶本地時間,如果用戶本地時間錯亂就會出問題,所以優(yōu)先使用cache-control?
ETAG和cache-control區(qū)別 :cache-control直接不請求,ETAG請求但是不下載
總結(jié)
- 上一篇: Spring+ Spring cloud
- 下一篇: PHP无限极分类原理