之前几次面试,有一些问题没有答得出来,或者答得糊里糊涂的,有如下:
今天学习了https加密算法,箭头函数,垃圾回收等一些内容。
加密:
对称加密: 客户端用密钥A对data加密,服务器用密钥A对data解密,服务器用密钥A加密,再传给客户端,并且客户端用密钥A进行解密。
此时会出现问题,就是无法保证客户端和服务端之间都有一个一样的密钥,倘若客户端向服务端传输了这个密钥,但如果这个密钥在传输过程被劫持了,同样会不安全。所以这个加密方式,并不是很可靠,除非双方都有一个相同的密钥。
非对称加密:他会有一组密钥对,分别是公钥和私钥。首先服务器会发送给客户端公钥,之后客户端会用公钥对data进行加密,传递给服务器,服务器再用私钥对data解密。但这个只能保证单方向。
双非对称加密:即客户端有公钥A1,私钥A2,服务端有公钥B1,公钥B2,过程就如上述相同。但非对称加密非常耗时,这会影响效率。
非对称加密+对称加密: 服务器有公钥A1,A2,客户端随机生成一个密钥X,服务端向客户端传送公钥A1,客户端用密钥X进行加密传送给服务端,服务端用A2进行解密。此时客户端可以用密钥X加密data并输送数据,服务端用X解密,服务端也可以同样如此。
此时也会有问题,如果有个中间人将服务端传过来的公钥A1,修改成B1发送给客户端,此时中间人就可以用B2得到客户端的密钥X。
所以要保证客户端拿到的就是服务端的公钥。
互联网中有一个CA机构,颁布了一个数字证书,可以证明上述问题。数字证书会有一个数字签名和明文信息,若客户端想知道自己拿到的是否是服务端的公钥,是通过如下过程:
客户端拿到了证书,有了明文信息M1,数字签名N1。
客户端用CA机构的公钥对数字签名N1解密,得到N2;用hash算法对M1进行hash得到M2,将M2和N2进行比较即可,等于则表示是服务端发来的证书。
箭头函数: 1、 没有prototype,箭头函数本身没有this。2、箭头函数的this指向在定义的时候继承自外层第一个普通函数的this。即父级作用域的this。3、无法改变箭头函数中的this指向。4、不可以使用arguments对象。5、不可以使用yield命令,
普通函数的this指向调用它的地方。
this的绑定优先级: new>显示>隐式>默认
new是指当new一个构造函数的时候,此时的this指向新创建的对象
显示绑定:指用call,apply,bind来强硬修改this
隐式绑定:指形如xxx.a()。
还学习了垃圾回收的一部分内容。还有挺多内容还没有深入去了解。
垃圾回收:就是指找到不要用到的内存,然后释放其内存。标记清除算法:垃圾收集器在运行的时候,会把所有变量都加上一个标记,假设内存中所有对象都是垃圾,全部标记为0,然后从根对象开始遍历,不是垃圾的节点改成1,然后清理所有标记为0的垃圾,销毁并回收所占用的内存,最后把所有内容对象都修改为0,等待下一轮回收。
优点:实现简单。缺点:清楚后剩余对象内存位置不变,空间也不连续,出现内存碎片。
标记整理算法会解决上述问题。
明天还需要面试,在面试之前打算把之前的一些问题全部了解,希望能有个好的结果。