从输入url到显示页面的过程
{
(核心思路:应用层-传输层-ip层-数据链路层-物理层来回的传递请求
具体流程:Dns域名解析,Tcp连接,HTTP连接,处理请求返回HTTP响应,页面渲染,关闭连接
)
1、首先,在浏览器地址栏中输入url,键盘将输入的数据发送给操作系统,判断是不是系统命令,然后发送数据给应用程序。
2、Dns域名解析:因为在地址栏输入的域名不是真正的资源所在位置,域名只是ip地址的一个映射。域名方便我们去记住一串串数字组成的ip地址,Dns域名的解析则是让域名转化为ip地址的过程。
Dns解析的方式:
①迭代查询 ②递归查询
3、Tcp连接: 在获取域名解析后,我们拿到了服务器的ip地址,此时会开始第一次连接,这是由Tcp协议完成,过程是三次握手。
4、浏览器向服务器发送tcp连接建立三次握手。
浏览器向服务器发送同步请求(syn)
服务器向浏览器回复请求应答(syn+ack确认报文)
浏览器返回服务器确认包(ack)
5、浏览器向服务器发送http请求,服务器收到请求后返回数据给浏览器。(包括:请求行、请求头、请求正文)
6、HTML解析以及DOM树、CSS ruleTree的解析和渲染;
①渲染引擎线程解析HTML文档,转化出一颗Dom树
②css渲染线程解析内联、外联、嵌入的Css样式,渲染出另一颗render tree
③渲染树木的布局处理
④遍历渲染树,并用Ui后端层将每一个节点绘制出来
7、关闭连接,四次挥手过程:
浏览器确认发送完请求,且服务器已经完全接收。浏览器发送Fin终止请求;
服务器返回浏览器ACk确认报文;
服务器可能还在发送数据,若发送完毕,服务器发送Fin终止请求给浏览器;
浏览器接收到后,发送Ack给服务器,并且浏览器等待2ms后,若未再收到任何消息,浏览器关闭连接,服务器关闭连接。
}
深拷贝的简单实现
定义: 浅拷贝指的是拷贝前后共用一片堆区内存;
深拷贝指的是拷贝前后对象的所在内存区域不同;
方法1: 对于对象的克隆,直接用JSON对象和字符串之间的转换
function cloneDeep1(obj){
let _obj = JSON.stringify(obj);
let _result = JSON.parse(_obj)
return _result;
}
方法2:当不确定传入的参数是对象、数组、null、regExp或非引用数据类型的时候,需要区分判断,通过递归实现:
function cloneDeep(target){
let result
if(typeof (target) === 'object'){
if(Array.isArray(target)){
//若传入参数是数组的情况
result = []
for( let [index,item] of target.entries()){
result[index].push( cloneDeep(target[index]) ) //使用for-of,结合arr.entries方法遍历数组
}
}
else if(target === null){
//若传入参数是null的情况
result = null
}
else if (target.constructor === RegExp){
result = target
}
else{
//若传入参数是对象
result = {}
for(let s of Object.keys(target)) //for-of 遍历Object.keys转换对象后的可枚举类型
result[s] = cloneDeep(target[s])
}
} else { //若非引用数据类型,直接拷贝
result = target
}
return result;
}