【面经整理2】垃圾清理机制、挥手握手、HTTP状态码、let const var、set map

1.内存泄露和js垃圾回收机制

内存泄漏指的是内存存不下了导致信息溢出。
程序的运行需要内存,如果之前运行的内存没有被清除一直占着位置,就会导致系统变卡进程无法执行。
举个例子就是占着茅坑不拉屎(内存不使用)导致后面来的人没有厕所上
不使用的内存没有得到及时释放就叫内存泄漏

js中垃圾回收机制可以分为两种:
1.针对新生代的scanvenge觅食机制
2.针对老生代的标记-清除机制

首先解释一下什么是新生代和老生代。
新生代中存放的是生存时间短的对象,老生代存放生存时间久的对象

scanvenge觅食机制的流程如下图:
在这里插入图片描述
新生代回收机制时会分为两个空间,from空间中装的是内存,to空间为全空的空间。
把from空间中还要使用的内存转移到to空间中,不使用的内存直接清除。转移好之后,原来的to空间装入了还要使用的内存,变成新的from空间;原来的from空间变为全空空间,变成新的to空间。如此from-to循环往复清理废弃内存。

如果一个新生代中存在对象在两次转换后仍然存在,就会晋升为老生代。这个叫做对象晋升策略。

老生代中的垃圾回收机制叫做标记-清除,如图:
在这里插入图片描述
具体过程就是把要清除的内存进行标记,然后进行清除。再将剩下存活的内存进行整理。这就空出了一大块空白的内存空间可以继续利用。

老生代中的对象占用内存比较大,所以清除整理过程会耗费一定的时间。JS中把这个过程的大任务拆分成一个个小任务,和js主线程交替进行。
在这里插入图片描述

2.三次握手,四次挥手

在这里插入图片描述
TCP的三次握手主要目的是让客户端跟服务器建立可以发送数据的链接。
三次握手的过程如上图所示。

客户端跟服务器进行第一次握手时会发送SYN信号,指的是同步的意思,客户端想跟服务器进行信息同步。同时客户端还会携带上报文的序号(为了传输数据安全性随机生成的)便于服务端确认。服务端收到第一次握手的信息后,会跟客户端进行第二次握手。第二次握手带上SYN同步信号和ACK确认信号,表明我已经确认收到你的消息了。第二次握手的时候,服务端还会给客户端发送一个自己的序号以及确认号,确认号为客户端序号加一。第三次握手时,客户端会给服务器端发送一个ACK确认信号,同时带上序号和确认号。序号为第二次握手中服务端发送的确认号,确认号为服务端的序号加一。
.
三次握手之后两个端口就可以进行信息传输。

写到这里我们要确认几点:
首先,为什么会有序号?
每次的报文信息很长,TCP会把报文切分成一个个报文段,序号定位了当前报文段的位置。
那为什么会有确认号,为什么确认号是上一次握手的序号加一?
确认号是指期待收到对方下一个报文段的第一个数据字节的序号
也就是当前报文段序号+1
SYN是一个标志位,虽然它的全称是Synchronize sequence numbers(同步序列编号),但是作为SYN,它只是一个标志。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
在这里插入图片描述

TCP的四次挥手主要目的是断开链接,过程如上图所示。

客户端想要跟服务器端断开连接,进行第一次挥手。第一次挥手时携带了FIN结束标签和ACK确认标签。服务端接收到第一次挥手的信号,知道了要断开连接,但是服务器中还有没传输完的数据。这个时候服务器会进行第二次挥手,把ACK确认信号发给客户端,把没传输好的数据传输完毕。此时的序号是服务器第一次挥手的确认号,确认号 是第一次挥手的序号加一。传输完数据后会进行第三次挥手,依旧是服务端发出信号,携带的序号和确认号与第二次挥手一致。由于已经传输完毕,所以会携带FIN完成标签和ACK确认标签传递给客户端。客户端收到第三次挥手后,序号是服务端的确认号,确认号是序号加一。进行第四次挥手,携带ACK标签。服务器只要收到了客户端发出的确认,立即进入CLOSED状态

3.HTTP状态码

状态码一般由3位构成:

1xx : 表示请求已经接受了,继续处理。
2xx : 表示请求已经处理掉了。
3xx : 重定向。
4xx : 一般表示客户端有错误,请求无法实现。
5xx : 一般为服务器端的错误。

  • 200 OK 客户端请求成功。
  • 301 Moved Permanently 请求永久重定向。
  • 302 Moved Temporarily 请求临时重定向。
  • 304 Not Modified 文件未修改,可以直接使用缓存的文件。
  • 400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
  • 401 Unauthorized 请求未经授权,无法访问。
  • 403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因。
  • 404 Not Found 请求的资源不存在,比如输入了错误的URL。
  • 500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
  • 503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。

4.ES6新特性

promise、解构、箭头函数、let和var、生成器迭代器。。。

5.let,const,var的区别

let和const是ES6中新增的,let和var定义的是变量,const定义的是常量

let可以形成块级作用域,var不行

const和let不能重复定义,var可以
var可以预解析输出undefine,let和const会报错

6.var变量提升以及可能出现的问题

var可以预解析输出undefine,let和const会报错
问题:
变量容易在不被察觉的情况下覆盖掉
本来要销毁的变量没能销毁

7.set和map

Map是什么:

Map是一组键值对的结构,可以存储key和value
初始化Map需要一个二维数组,或者直接初始化一个空Map。Map具有以下方法:

var m = new Map(); // 空Map
m.set('Adam', 67); // 添加新的key-value
m.set('Bob', 59);
m.has('Adam'); // 是否存在key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 删除key 'Adam'
m.get('Adam'); // undefined

由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:

var m = new Map();
m.set('Adam', 67);
m.set('Adam', 88);
m.get('Adam'); // 88

Set是什么:

Set也是一组集合,Set和Map类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。重复的元素在set中直接被过滤

 var k = new Set([1,2,3,'love']);
    console.log(k);
    k.add('h')
    console.log(k);
    k.delete(1)
    console.log(k);

Set和Map的区别:

Map是键值对的集合,Set中只有值,所以Set中没有get方法
Set中不能有重复的元素,所以可以用来进行数组去重
都能通过迭代器进行for…of遍历

8.set的循环方式的实现

1.使用for of
2.使用foreach

    var m = new Map();
    m.set('Lisa',15);
    m.set('Jenny',67);
    m.set('july',77)
    for(let i of m){
        console.log(i);
    }
    var k = new Set([1,2,3,'love']);
    k.forEach(element => {
        console.log(element);
        
    });

9.map的遍历的方式,返回的是什么

第一种forof返回键值对
第二种foreach中有一个函数,可以返回value,key,和整个键值对

    for(let i of m){
        console.log(i);//返回键值对
    }
    m.forEach(function(value,index,arr){
        console.log(arr);
        console.log(index);
    })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值