输入 url 到渲染的过程
1.在浏览器中输入一个 URL 2.通过 DNS 将域名解析成 IP 地址。域名只是与 IP 地址的一个映射。域名解析的过程实际是将域名还原为 IP 地址的过程(如果输入的是 IP 地址,此步骤省略) 3.根据解析到的 IP 地址加端口 ,浏览器发起 http 请求 4.浏览器建立一条与服务器的 tcp 连接(建立过程:三次握手)
- 第一次握手: 建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SENT 状态,等待服务器确认;
- 第二次握手: 服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
- 第三次握手: 客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED(TCP 连接成功)状态,完成三次握手。
- 第一次挥手:Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN_WAIT_1 状态。
- 第二次挥手:Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号+1(与 SYN 相同,一个 FIN 占用一个序号),Server 进入 CLOSE_WAIT 状态。
- 第三次挥手:Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入 LAST_ACK 状态。
- 第四次挥手:Client 收到 FIN 后,Client 进入 TIME_WAIT 状态,接着发送一个 ACK 给 Server,确认序号为收到序号+1,Server 进入 CLOSED 状态,完成四次挥手。 5.浏览器通过 tcp 的三次握手建立好连接后,便向服务器发送 HTTP 请求,请求数据包 6.服务器收到并处理 HTTP 请求,根据请求信息去查找资源,返回响应信息 7.浏览器接收 HTTP 响应 8.如果报文中的状态码表示请求成功,则接受返回的资源(如 HTML 文件),至此浏览器已经拿到了一个 HTML 文档,并为了呈现文档而开始解析。 11.至此浏览器已经拿到了一个 HTML 文档,并为了呈现文档而开始解析。 12.页面全部渲染结束。 13.四次挥手关掉 TCP 连接。
拍平对象
function copy(input) {
let result = {
};
const flatten = (params, key) => {
if (params instanceof Array) {
params.forEach((param, index) => {
if (param instanceof Object || param instanceof Array) {
flatten(param, `${
key}[${
index}]`);
} else {
result[`${
key}[${
index}]`] = flatten(param, `${
key}[${
index}]`);
}
});
} else if (params instanceof Object) {
for (var itemKey in params) {
const itemValue = params[itemKey];
if (itemValue instanceof Array) {
flatten(itemValue, itemKey);
} else if (itemValue instanceof Object) {
flatten(itemValue, itemKey);
} else if (itemValue === null || itemValue === undefined) {
} else {
if (key) {
result[`${
key}.${
itemKey}`] = flatten(itemValue, itemKey);
} else {
result[itemKey] = flatten(itemValue, itemKey);
}
}
}
} else {
return params;
}
};
flatten(input);
return result;
}
let input = {
a: 1,
b: [
1,
2,
{
c: true,
},
[3],
],
d: {
e: 2,
f: 3,
},
g: null,
};
copy(input);
数组差集
let subSet = function (arr1, arr2) {
var set1 = new Set(arr1);
var set2 = new Set(arr2);
var subset = [];
for (let item of set1) {
if (!set2.has(item)) {
subset.push(item);
}
}
return subset;
};
字符串解码
function decodeString(input) {
let i1 = input.lastIndexOf("[");
let i2 = input.indexOf("]", i1);
if (i1 > -1 && i2 > -1) {
let oldStr = input.substring(i1, i2 + 1);
let number = "";
for (let i = i1 - 1, j = 0; ; i--, j++) {
if (input[i]) {
if (!(input[i] >= 0)) {
break;
} else {
number = input[i] + number;
}
}else{
break;
}
}
function change(str, num) {
let newStr = "";
for (let i = 0; i < num; i++) {
newStr += str;
}
return newStr;
}
input = input.replace(number + oldStr, change(oldStr.slice(1, -1), number));
return decodeString(input);
} else {
return input;
}
}
let str = '2[3[a]2[bc]]'