哪吒人生信条:若是你所学的东西 处于喜欢 才会有强大的动力支撑。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