哪吒人生信條:若是你所學的東西 處於喜歡 纔會有強大的動力支撐。javascript
天天學習編程,讓你離夢想更新一步,感謝不負每一份熱愛編程的程序員,不論知識點多麼奇葩,和我一塊兒,讓那一顆像四處流蕩的心定下來,一直走下去,加油,2021
加油!歡迎關注加我vx:xiaoda0423
,歡迎點贊、收藏和評論html
不要懼怕作夢,可是呢,也不要光作夢,要作一個實幹家,而不是空談家,求真力行。前端
但願能夠經過這篇文章,可以給你獲得幫助。(感謝一鍵三連),接收好挑戰了嗎?java
關於HTTP模塊
好的,HTTP是超文本傳輸協議,是一個基於請求與響應,無狀態的,應用層的協議,常基於TCP/IP協議傳輸數據,互聯網上應用最爲普遍的一種網絡協議,全部的www
文件都必須遵照這個標準,設計HTTP
的初衷是爲了提供一種發佈和接收HTML
頁面的方法。git
HTTP
是一種普遍使用的網絡傳輸協議,是客戶端瀏覽器或其餘程序與web服務器之間的應用層通訊協議或者標準tcp,用於從www服務器傳輸超文本到本地瀏覽器的傳輸協議,它可使瀏覽器更加高效,使網絡傳輸減小。程序員
那麼HTTPS
,它是一種經過計算機網絡進行徹底通訊的傳輸協議,通過HTTP
進行通訊,利用SSL/TLS
創建通訊,加密數據包。HTTPS
使用的主要目的是提供對網站服務器的身份認證,同時保護交換數據的隱私與完整性。es6
https是http的加密版,是以安全爲目標的http,在http中加入ssl,安全基礎是ssl。
github
TLS
是傳輸層加密協議,前身是SSL
協議。web
HTTP
一般承載於TCP
之上,在HTTTP
和TCP
之間添加一個安全協議層(SSL
或TSL
),就是咱們常說的HTTPS
。編程
HTTP特色:
支持客戶端或服務器模式,C/S模式;
簡單快速,客戶端向服務器請求服務時,只需傳送請求方法和路徑。請求方法經常使用的有GET,HEAD,POST
,每種方法規定了客戶與服務器聯繫的類型不一樣,因爲HTTP協議簡單,使得HTTP服務器的程序規模小,於是通訊速度很快;
比較靈活,HTTP容許傳輸任意類型的數據對象,正在傳輸的類型由Content-Type
加以標記;
無鏈接,表示限制每次鏈接只處理一個請求,服務器處理完客戶端的請求,並收到客戶端的應答後,就斷開鏈接,採用這種方式能夠節省傳輸時間;
無狀態,HTTP
協議是無狀態的協議,無狀態表示協議對於事務處理是沒有記憶能力的,缺乏狀態意味着若是後續處理須要前面的信息,則它就必須重傳,這樣可能致使每次鏈接傳送的數據量不斷增長,另外一方面,在服務器不須要先前信息時它的應答就比較快。
HTTPS
特色
它是採用混合加密技術,中間者是沒法看到明文內容,對內容加密過;
又對身份進行驗證,經過證書認證客戶端訪問的是本身的服務器;
能夠防止傳輸的內容被中間人冒充或者篡改,保戶了數據的完整性。
HTTP
的URL
是以http://
開頭,對於HTTPS
的URL
是以https://
開頭;HTTP
是不安全的,而HTTPS
是安全的;HTTP
沒法加密,而HTTPS
對傳輸的數據進行加密;HTTP
無需證書,而HTTPS
須要CA
機構的頒發的SSL
證書。
它們的端口號分別是:
HTTP
默認的端口號爲80
,HTTPS
默認的端口號爲443
那麼HTTPS
更加安全的由於是:在網絡請求中,須要不少服務器,路由器的轉發。其中的節點均可能篡改信息,而若是使用HTTPS,密鑰在終點站纔有。HTTPS之因此比HTTP安全,是由於它利用ssl/tls
協議傳輸。它包含證書,卸載,流量轉發,負載均衡,頁面適配,瀏覽器適配,refer傳遞等技術,保障了傳輸過程的安全性。
https
,全稱Hyper Text Transfer Protocol Secure
,相比http
,多一個secure
,這一個secure
是由TLS(ssl)提供的。https
和http
都屬於application layer
,基於tcp
以及udp
協議,可是又徹底不同。
http是客戶端和服務器端之間數據傳輸的格式規範,表示「超文本傳輸協議」
小結
cookie
和會話保存信息http/2
你瞭解多少HTTP/2
引入了「服務器端推送」的概念,它容許服務器端在客戶端須要數據以前主動將數據發送到客戶端緩存中,從而提升性能。
HTTP/2
提供更多的加密支持。使用多路技術,容許多個消息再一個鏈接上同時交差。增長了頭壓縮,所以請求很是小,請求和響應的header
都只會用很小的帶寬比例。
http/2
協議是基於https
的,因此http/2
的安全性也是有保障的。
頭部壓縮:http/2
會壓縮頭,若是你同時發出多個請求,他們的頭是同樣的或是類似的,那麼,協議會幫你消除重複的部分。
對於http/2
再也不使用像http/1.1
裏的純文本形式的報文,而是採用了二進制格式。頭信息和數據體都是二進制,統稱爲幀,頭信息幀和數據幀。
數據流:http/2
的數據包不是按順序發送的,同一個鏈接裏面連續的數據包,可能屬於不一樣的迴應,必需要對數據包作標記,指出它屬於哪一個迴應。每一個請求或迴應的全部數據包,稱爲一個數據流。
多路複用:http/2
是能夠在一個鏈接中併發多個請求或迴應,而不用按照順序一一對應,解決了http/1.1
中的串行請求,不須要排隊等待,也就不會出現隊頭阻塞問題,下降了延遲,大幅度提升了鏈接的利用率。
服務器推送,http/2
改善了傳送的請求-應答工做模式,服務端再也不是被動響應,也能夠自動向客戶端發送信息了。
http2
問題出如今,多個http
請求在複用一個tcp
鏈接,下層的tcp
協議是不知道有多少個http
請求的,一旦發生丟包現象,會觸發tcp
的重傳機制,這樣一個tcp
鏈接中的全部的http
請求都必須等待這個丟了的包被重傳回來。
第一,http/1.1
中的管道傳輸中若是有一個請求阻塞了,那麼隊列後請求也通通被阻塞了。第二,http/2
多請求複用一個tcp
鏈接,一旦發生丟包,就會阻塞全部的http
請求。
五大類的http狀態碼:
1xx
: 提示信息,表示目前是協議處理的中間狀態,後續還有操做
2xx
: 成功,報文已經收到並被正確處理,200, 204, 206
3xx
: 重定向,資源位置發生變更,須要客戶端從新發送請求
4xx
: 客戶端錯誤,請求報文有誤,服務器沒法處理
5xx
:服務器錯誤,服務器在處理請求時內部發生了錯誤
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
表示服務器端暫時沒法處理請求http
事務流程第一步,域名的解析;第二步,發起tcp
的三次握手;第三步,創建tcp
鏈接後發起HTTP
請求;第四步,服務器端響應HTTP
請求,瀏覽器獲得HTML
代碼;第五步,瀏覽器解析HTML
代碼,並請求HTML
代碼中的資源;第六步,瀏覽器對頁面進行渲染並呈現給用戶。
HTTP
服務器var http = require('http'); http.createServer(function(req, res){ res.writeHead(200, {'Content-Type': 'text/html'}); res.write('<meta charset="UTF-8"><h1>dadaqianduan</h1>'); res.end(); }).listen(3000);
http
的請求報文和響應報文包含哪些部分請求報文包含三部分:
1.請求行,包含請求方法,URI,HTTP
版本信息
2.請求首部字段
3.請求內容實體
請求報文包含三部分:
1.狀態行,包含HTTP
版本,狀態碼,狀態碼的緣由短語
反向代理,Reverse Proxy
,是指經過代理服務器來接收互聯網上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並把從服務器上獲得的結果返回給互聯網上請求鏈接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。
GET
,請求訪問已經被uri,統一資源標識符識別的資源,能夠經過url,給服務器傳遞參數數據
POST
,傳輸信息給服務器,主要功能與GET方法相似,但傳遞的數據量一般不受限制。
PUT
,傳輸文件,報文主體中包含文件內容,保存到對應的URI位置。
HEAD
,得到報文首部,與GET方法相似,只是不返回報文主體,通常用於驗證URI是否有效。
DELETE
,刪除文件,與PUT方法相反,產生對應URI位置的文件
OPTIONS
,查詢相應URI支持的HTTP方法
HTTP
協議中1.0
版本規範與1.1
版本規範的區別在http1.0
中,當創建鏈接後,客戶端發送一個請求,服務器端返回一個信息後就關閉鏈接,當瀏覽器下次請求的時候又要創建鏈接,這種不斷創建鏈接的方法會形成不少問題。
在http1.1
中,引入了連續鏈接的概念,經過這種鏈接,瀏覽器能夠在創建一個鏈接以後,發送請求並獲得返回信息,而後繼續發送請求再次等到返回信息。客戶端能夠連續發送多個請求,而不用等待每個響應的到來。
HTTP
的首部字段包括哪些類型通用首部字段,請求報文和響應報文都會使用的首部字段
Date
,建立報文的時間Connection
,鏈接的管理Cache-Control
,緩存的控制Transfer-Encoding
,報文主體的傳輸編碼方式請求首部字段,請求報文會使用的首部字段
Host
,請求資源所在服務器Accept
,可處理的媒體類型Accept-Charset
,可接受的字符集Accept-Encoding
,可接受的內容編碼Accept-Language
:可接受的天然語言響應首部字段,響應報文會使用的首部字段
Accept-Ranges
,可接受的字節範圍Location
,令客戶端從新定向到URIServer
,HTTP服務器的安裝信息實體首部字段,請求報文與響應報文的實體部分使用的首部字段
Allow
,資源可支持的http方法Content-Type
,實體主體的類型Content-Encoding
,實體主體使用的編碼方式Content-Language
,實體主體的天然語言Content-Length
,實體主體的字節數Content-Range
,實體主體的位置範圍,通常用於發出部分請求時使用https
相比,http
有什麼缺點http
的缺點是:通訊使用明文,不加密,內容可能被竊聽,也就是被抓包分析;不驗證通訊方身份,可能遭到假裝;沒法驗證報文完整性,可能性篡改。
https
就是http+加密處理+認證+完整性保護
HTTP
請求利用負載均衡優化和加速HTTP
應用請求,利用HTTP
緩存來優化網站請求
支持客戶端或服務器模式,簡單快捷,靈活,無鏈接,無狀態。
HTTP1.1
版本的新特性默認持久鏈接,節省通訊量,只要客戶端或服務端中任意一端沒有明確指出斷開TCP
鏈接,就一直保持鏈接,能夠屢次發送HTTP
請求。
管線化,客戶端能夠同時發出多個HTTP
請求,而不用一個個等待響應。
斷點續傳原理。
tcp
傳輸的三次握手,四次揮手三次握手,用tcp把數據包發送出去後,tcp
不會對傳送後的數據置之不理,它必定會向對方確認是否成功送達。握手過程當中使用了tcp的標誌,既是 SYN 和 ACK
發送端首先給接收端發送一個帶SYN
標誌的數據包。接收端收到後,回傳一個帶有SYN/ACK
標誌的數據包以表示正確傳達,並確認信息。最後,發送端再回傳一個帶ACK
標誌的數據包,表明「握手」結束。若在握手過程當中的某個階段莫名中斷,TCP
會再次以相同的順序發送相同的數據包。
斷開一個TCP
鏈接則須要「四次握手」
第一次握手:主動關閉方發送一個 FIN,用來關閉主動關閉方到被動關閉方的數據傳送,也就是主動關閉方告訴被動關閉方,主動關閉方已經不會再給被動關閉方發送數據了,可是,此時主動關閉方還能夠接收數據。
第二次握手:被動關閉方收到FIN包後
,給對方發送一個ACK
,確認序號爲收到序號+1,與SYN相同
,一個FIN
佔用一個序號。
第三次握手:被動關閉方收到FIN
包後,用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,被動關閉方的數據也發送完了,不會再給主動關閉方發送數據了。
第四次握手:主動關閉方收到FIN後,給被動關閉方發送一個ACK
,確認序號爲收到序號+1
。
tcp
傳輸控制協議,是基於鏈接的協議,也就是說,在正式收發數據前,必須和對方創建可靠的鏈接。一個tcp
鏈接必需要通過三次對話才能創建起來。
udp
用戶數據報協議,是與tcp相對應的協議。它是面向非鏈接的協議,它不與對方創建鏈接,而是直接就把數據包發送過去。udp
適用於一次只傳送少許數據,對可靠性要求不高的應用環境。
url
到頁面加載顯示完成的過程發送什麼當發送一個url
請求時,這個url是web
頁面的url仍是web頁面上每一個資源的url
,瀏覽器都會開啓一個線程來處理這個請求,同時在遠程dns服務器上啓動一個dns查詢,這能使瀏覽器得到請求對應的Ip地址。
瀏覽器與遠程web
服務器經過tcp
三次握手協商來創建一個tcp/ip
鏈接。該握手包括一個同步報文,一個同步-應答報文和一個應答報文,這個3個報文在瀏覽器和服務器之間傳遞,該握手首先由客戶端嘗試創建起通訊,而後服務器應答並接受客戶端的請求,最後由客戶端發出已經接受該請求的報文。
一旦tcp/ip
鏈接創建,瀏覽器會經過該鏈接向遠程服務器發送HTTP的GET請求
,遠程服務器找到資源並使用HTTP響應返回該資源,值爲200的HTTP響應狀態碼錶示一個正確的響應。
web服務器提供資源服務,客戶端開始下載資源,請求返回後,便進入了瀏覽器模塊,瀏覽器會解析HTML生成DOM Tree
,其次會根據CSS生成CSS規則樹
,而javascript又能夠根據DOM API操做DOM
。
304
緩存的原理服務器首先爲請求生成ETag
,服務器可在稍後的請求中,使用它來判斷頁面是否已經修改,本質上,客戶端經過將該記號傳回服務器要求服務器驗證其客戶端是否緩存。
304是HTTP
狀態碼,服務器用它來標識這個文件沒有修改,不返回內容,瀏覽器在接收到個狀態碼後,會使用瀏覽器已緩存的文件。
客戶端請求頁面A,服務器返回頁面A,並給A加上一個ETag,客戶端展示該頁面,並將頁面連同ETag一塊兒緩存,客戶端再次請求頁面A,並將上次請求時服務器返回的ETag一塊兒傳遞給服務器。服務器檢查該ETag,並判斷出該頁面自上次客戶端請求以後還未被修改,直接返回響應304和一個空的響應體。
es模塊
with
語句delete
刪除變量,方法等,只能用delete
刪除對象的屬性eval
不會在它的外層做用域引入變量eval和arguments
不能被從新賦值arguments
不會自動反映函數參數的變化arguments.callee
arguments.caller
this
指向全局對象fn.caller和fn.arguments
獲取函數調用的棧es6
${}
for-of
arguments
對象es6
將Promise
對象歸入規範,提供了原生的Promise
對象let
關鍵字以定義塊做用域的變量const
以定義常量Symbol
數據類型module
模塊的概念Promise
有哪些特色es6
原生提供了Promise
對象,它是用來處理異步操做的。
Promise
對象特色:
對象的狀態不受外界影響,Promise對象有三個狀態:Pending,進行中,Resolved,已完成,Rejected,已失敗
,只有異步操做的結果,能夠決定當前是哪種狀態,任何其餘操做都沒法改變這個狀態。
一旦狀態改變,就不會再改變,任什麼時候候均可以獲得這個結果。Promise對象的改變,只有兩種可能,從Pending變爲Resolved和從Pending變爲Rejected
。只有這兩種狀況,狀態就固定了,會一直保持這個結果,不會再變了。
即便對Promise
對象添加回調函數,也會當即獲得這個結果,這與事件徹底不一樣,事件的特色是,若是你錯過了它,再去監聽,也沒法獲得結果。
有了Promise
對象,就能夠將異步操做以同步操做的流程表達出來,避免了層層嵌套到的回調函數,此外,Promise
對象提供統一的接口,使得控制異步操做更加容易。
缺點:沒法取消Promise
,一旦新建,它就會當即執行,沒法中途取消,若是不設置回調函數,Promise
內部拋出的錯誤不會反映到外部。
Promise
的理解三種狀態:
Pending
指初始狀態,非Fulfilled
或Rejected
狀態
Resolved
指成功的操做
Rejected
是指失敗的操做
let p = new Promise(resolve, reject) => { if(condition) { resolve(result) }else{ reject(result) } } }); promise.then(onResolved,onRejected)
// es5 var varr [1,2,3,4,3,4,5,5,3] function removeDa(arr){ var obj = {}; arr.forEach(function(item,index){ obj[item] = true }) return Object.keys(obj); } // es6 let removeDa = arr => [...{new Set([...arr]))];
let a = 1, b = 2; [a,b] = [b,a]; console.log(a); // 2 console.log(b); // 1
es6
第一:符合將來趨勢;第二:提升開發效率;第三:減小代碼量,提升可讀性等。
es6
使用babel
編譯
es6
中let
關鍵字支持塊級做用域嗎var arr = []; for (var i = 0; i < 5; i++){ arr[i] = function(){ console.log(i); } } arr[3](); // 5 let arr = []; for(let i = 0; i < 5; i++) { arr[i] = function() { console.log(i); } } arr[3](); // /5
let
爲JavaScript
新增了塊級做用域,用它聲明的變量只在let
關鍵字所在的代碼塊內有效。
var obj = { // es5 fn1: function() { console.log('fn1',this) }, fn2:() => { console.log('fn3',this) } } obj.fn1(); // obj obj.fn2(); // window
super
是什麼它是一個關鍵字,用法爲super(...)
或者super.xx(...)
super
的語法定義和this
不一樣,this
的定義是this
這個關鍵字會被替換成一個引用,而super
則是super(...)
會被替換成一個調用。除了能夠在constructor
裏被直接調用super
外,還可使用super.xx(...)
來調用父類上的某個原型方法,這一樣是一種限定語法。
(function(x,f=()=>x){ var x: var y = x; x = 2; return [x,y,fn()]; })(1) [2,1,1]
(function(){ console.log([ (()=>this.x).bind({x:'inner'})(), (()=>this.x)() }) }).call({x:'outer'}); // ['outer','outer']
(function(){ let a = this?class b{} : class c{}; console.log(typeof a, typeof b, typeof c) })() // function undefined undefined
(typeof (new (class { class () {} }))) // object
var Test = class{ class(){} }; var test = new Test(); typeof test;
(function(){ if(false){ let f={g()=>1}; } return typeof f; })() // error
DOM
模板dom
模板是原先就寫在頁面上的而且能被瀏覽器識別的html
結果,在加載的時候,就會被瀏覽器渲染。因此要遵循HTML
結構和標籤命名,否則沒法被瀏覽器解析,也就沒法獲取內容了,而後用JavaScript
獲取DOM
節點的內容,就造成了DOM
模板。
字符串模板可能原先放在服務器上的script
標籤裏,做爲JavaScript
字符串,而且不參與頁面渲染,因此它可能不在意HTML
結構和標籤命名,只要最後根據模板生成對應的結構而且命名符合HTML
規範。
在某種程度上,剩餘操做符和擴展運算符相反。擴展運算符會使數組「展開」成多個元素,剩餘操做符會收集多個元素並「壓縮」成一個單一的元素。
var,let,const
聲明變量的區別var
聲明的變量不支持塊做用域,支持聲明前置,能夠重複定義,而且值能夠改動。
let
聲明的變量支持塊做用域,不支持聲明前置,不能重複定義,而且值能夠修改。
const
定義常量,聲明的常量支持做用域,不支持聲明前置,不能重複定義,值沒法修改,值一般是值類型的,不能用來定義循環變量。
對象解構;數組解構;混合解構;參數解構。
es6
的extends
支持多重繼承嗎es6
不支持多重繼承,可是能夠經過混合等技術來模擬,一旦使用多重繼承,則按聲明前後順序覆蓋同名屬性方法。
arguments
對象的區別剩餘參數只包含那些沒有對應形參的實參,而arguments
對象包含了傳給函數的全部實參。
arguments
對象不是一個真實的數組,而剩餘參數是真實的Array
實例,可以在它上面直接使用全部的數組方法。
arguments
對象還有一些附加的屬性。
若是想在arguments
對象上使用數組方法,首先要將它轉換爲真實的數組。
for..of
有點是啥有着同for...in
的簡潔語法,可是沒有for...in
的缺點
不一樣於forEach
方法,能夠與break,continue,return
配合使用
提供了遍歷全部數據結構的統一操做接口
修飾器只能用於類和類的方法,不能用於函數,由於存在函數提高
Iterator
接口的目的是啥爲全部數據結構提供了一種統一的訪問機制,for..of
循環
當使用for...of
循環遍歷某種數據結構時,該循環會自動尋找Iterator
接口.
代碼在模塊做用域中進行,而不是在全局做用域中運行,模塊內部的頂層變量,在外部不可見。
不管有沒有聲明use strict
,模塊腳本都自動採用嚴格模式
在模塊中,可使用import
命令加載其餘模塊,也可使用export
命令輸出對外接口
在模塊中,頂層的this
關鍵字返回undefined
,而不是指向window
,也就是說在模塊頂層使用this
,是無心義的。
同一個模塊若是加載屢次,將只執行一次。
Iterator
的做用和遍歷過程第一,爲各類數據結構提供一個統一的,簡便的訪問接口
第二,使得數據結構的成員可以按某種次序排序
第三,ES6
創造了一種新的遍歷命令for...of
循環,Iterator接口主要提供for...of
使用
過程:
建立一個指針對象,指向當前數據結構的起始位置,也就是說,遍歷器對象本質上就是一個指針對象。
第一次調用指針對象的next
方法,能夠將指針指向數據結構的第一個成員
第二次調用指針對象的next
方法,指針指向數據結構的第二個成員
不斷調用指針對象的next
方法,直到它指向數組結構的結束位置。每一次調用next
方法,都會返回數據結構中當前成員的信息。
async
函數有幾種聲明形式函數聲明
async function da(){}
表達式聲明
var bar = async function () {}
經過對象聲明
var obj = { async daFun(){} }
經過箭頭函數聲明
var da = async() =>{}
async
函數中,如何處理錯誤語句try...catch
async function demo() { try{ await doSomeThing(); } catch(err){ console.log(err) } }
添加catch
回調函數
async function demo() { await doSomeThing().cache(err=>console.log(err)) }
es6
中,generator
函數的throw
方法如何使用throw()
會恢復generator
的執行,且在執行點上拋出異常
throw()
跟next()
同樣會返回{value,done}
,只會拋出的異常獲得處理了,generator
函數體纔會真正執行throw()
。
我是Jeskson
(達達前端),感謝各位人才的:點贊、收藏和評論,咱們下期見!(如本文內容有地方講解有誤,歡迎指出☞謝謝,一塊兒學習了)
文章持續更新,能夠微信搜一搜「 程序員哆啦A夢 」第一時間閱讀,回覆【資料】有我準備的一線大廠資料,本文 http://www.dadaqianduan.cn/#/ 已經收錄
github
收錄,歡迎Star
:https://github.com/webVueBlog/WebFamily