function insert(head, n ,val) {
var node = {
val: val,
next: null
}
if (head == null) {
return node
}
if (n === 0) {
node.next = head;
return node;
}
var p = head;
for(var i=0; i<n-1; i++){
p = p.next;
}
node.next = p.next;
p.next = node;
return head;
}
复制代码
function remove(head, n) {
if (!head) {
return null;
}
if (head === 0) {
return head.next;
}
var p = head;
for(var i=0; i<n-1; i++) {
p = head.next;
}
p.next = p.next.next;
return head;
}
复制代码
function myInstanceOf(left, right) {
if (typeof left !== 'object' || left == null) {
return false;
}
let pro = Object.getPrototypeOf(left);
while(true) {
if (pro === null) {
return false;
}
if (pro === right.prototype) {
return true;
}
pro = Object.getPrototypeOf(pro);
}
}
复制代码
remcss
(function(doc, win) {
var docE1 = doc.documentElement,
resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
recalc = function() {
var clientWidth = docE1.clientWidth;
if (!clientWidth) return;
docE1.style.fontSize = clientWidth / 7.5 + 'px';
}
if(!doc.addEventListener) return;
win.addEventListener(resizeEvt, recalc, false);
doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window)
复制代码
HTTPS协议=HTTP协议+SSL/TLS协议,数据传输的过程当中,须要使用SSl/TLS协议对数据进行加密和解密,须要用HTTP对加密后的数据进行传输,由此能够看出HTTPS是由HTTP和SSL/TLS一块儿合做完成的。html
缘由:非对称加密基于大数运算,好比大素数或者椭圆曲线,是复杂的数学难题,因此消耗计算量,运算速度慢。除了慢,可能还有一个缺点就是须要更多的位数,相同强度的对称密钥要比非对称密钥短。对称密钥通常都128位、256位,而rsa通常要2048位,不过椭圆曲线的会短一点前端
头部压缩: 采用HPACK算法,在客户端和服务端两端创建“字典”,用索引号表示重复的字符串, 还采用哈夫曼编码来压缩整数和字符串,能够到达50%-90%的高压缩率。vue
多路复用: 采用二进制分帧传输,不存在前后关系, 所以也就不会有等待排队,也就没有了HTTP 的对头阻塞问题。 通讯双方均可以给对分发送二进制帧, 这种二进制帧的双向传输的序列,也叫作流。 HTTP/2用流来在一个TCP链接上来进行数据帧的通讯, 这就是多路复用的概念。node
设置请求优先级: 在二进制帧当中还有其它的一些字段, 实现了优先级和流量控制等功能webpack
服务器推送 服务器再也不是彻底被动地响应请求,也能够新建“流”主动向客户端发送消息。web
CSRF 攻击就是黑客利用了用户的登陆状态,并经过第三方的站点来作一些坏事面试
应对手段:算法
1.充分利用好 Cookie 的 SameSite 属性。 咱们能够针对实际状况将一些关键的 Cookie 设置为 Strict 或者 Lax 模式, 这样在跨站点请求时,这些关键的 Cookie 就不会被发送到服务器,从而使得黑客的 CSRF 攻击失效。element-ui
HTTP 请求头中的 Referer 和 Origin 属性 服务器的策略是优先判断 Origin,若是请求头中没有包含 Origin 属性, 再根据实际状况判断是否使用 Referer 值
第一步,在浏览器向服务器发起请求时,服务器生成一个 CSRF Token。 CSRF Token 其实就是服务器生成的字符串,而后将该字符串植入到返回的页面中。 第二步,在浏览器端若是要发起转帐的请求,那么须要带上页面中的 CSRF Token, 而后服务器会验证该 Token 是否合法。若是是从第三方站点发出的请求, 那么将没法获取到 CSRF Token 的值,因此即便发出了请求, 服务器也会由于 CSRF Token 不正确而拒绝请求。
1.先判断强缓存是否生效: 控制强缓存的字段分别是Expires和Cache-Control(优先级较高),
Expires:是HTTP/1.0控制网页缓存的字段, 值为服务器返回该请求结果缓存的到期时间
即再次发起该请求时,若是客户端的时间小于Expires的值时,直接使用缓存结果。
到了HTTP/1.1,Expire已经被Cache-Control替代
Cache-Control:主要取值
。 public:全部内容都将被缓存(客户端和代理服务器均可缓存)
。 private: 全部内容只有客户端能够缓存,Cache-Control的默认取值
。 no-cache:客户端缓存内容,可是是否使用缓存则须要通过协商缓存来验证决定
。 no-store:全部内容都不会被缓存,即不使用强制缓存,也不使用协商缓存
。 max-age=xxx (xxx is numeric):缓存内容将在xxx秒后失效
内存缓存(from memory cache)和硬盘缓存(from disk cache)
。内存缓存(from memory cache):内存缓存具备两个特色,分别是快速读取和时效性:
。快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,
占据该进程必定的内存资源,以方便下次运行使用时的快速读取。
。时效性:一旦该进程关闭,则该进程的内存则会清空。
。硬盘缓存(from disk cache):硬盘缓存则是直接将缓存写入硬盘文件中,
读取缓存须要对该缓存存放的硬盘文件进行I/O操做,而后从新解析该缓存内容,读取复杂,速度比内存缓存慢。
在浏览器中,浏览器会在js和图片等文件解析执行后直接存入内存缓存中,
那么当刷新页面时只需直接从内存缓存中读取(from memory cache);
而css文件则会存入硬盘文件中,因此每次渲染页面都须要从硬盘读取缓存(from disk cache)。
复制代码
2.协商缓存
协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求, 由服务器根据缓存标识决定是否使用缓存的过程
控制协商缓存的字段分别有:Last-Modified/If-Modified-Since 和 Etag/If-None-Match(优先级高)
Last-Modified / If-Modified-Since:
Last-Modified是服务器响应请求时,返回该资源文件在服务器最后被修改的时间。
If-Modified-Since则是客户端再次发起该请求时,携带上次请求返回的Last-Modified值,
经过此字段值告诉服务器该资源上次请求返回的最后被修改时间。
服务器收到该请求,发现请求头含有If-Modified-Since字段,
则会根据If-Modified-Since的字段值与该资源在服务器的最后被修改时间作对比,
若服务器的资源最后被修改时间大于If-Modified-Since的字段值,则从新返回资源,状态码为200;
不然则返回304,表明资源无更新,可继续使用缓存文件
Etag / If-None-Match :
Etag是服务器响应请求时,返回当前资源文件的一个惟一标识(由服务器生成)。
If-None-Match是客户端再次发起该请求时,携带上次请求返回的惟一标识Etag值,
经过此字段值告诉服务器该资源上次请求返回的惟一标识值。
服务器收到该请求后,发现该请求头中含有If-None-Match,
则会根据If-None-Match的字段值与该资源在服务器的Etag值作对比,一致则返回304,表明资源无更新,
继续使用缓存文件;不一致则从新返回资源文件,状态码为200,
总结:
强制缓存优先于协商缓存进行,若强制缓存(Expires和Cache-Control)生效则直接使用缓存,
若不生效则进行协商缓存(Last-Modified / If-Modified-Since和Etag / If-None-Match),
协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么表明该请求的缓存失效,
从新获取请求结果,再存入浏览器缓存中;生效则返回304,继续使用缓存
复制代码
function mergeSort(arr) {
const len = arr.length;
if (len <= 1 ) {
return arr;
}
let mid = Math.floor(len / 2);
let leftArr = mergeSort(arr.slice(0,mid));
let rightArr = mergeSort(arr.slice(mid, len));
arr = mergeArr(leftArr, rightArr);
return arr;
}
function mergeArr(arr1, arr2){
let i = 0;
let j = 0;
let len1 = arr1.length;
let len2 = arr2.length;
let res = [];
while(i<len1 && j<len2) {
if (arr1[i] < arr2[j]) {
res.push(arr1[i])
i++;
} else {
res.push(arr2[j])
j++;
}
}
if (i<len1) {
return res.concat(arr1.slice(i));
} else {
return res.concat(arr2.slice(j));
}
}
复制代码
function quickSort(arr, left=0; right=arr.length - 1) {
if (arr.lenth > 1) {
const lineIndex = partition(arr,left, right);
if (left < lineIndex -1) {
quickSort(arr,left,lineIndex -1);
}
if (right > lineIndex) {
quickSort(arr,lineIndex,right);
}
}
return arr;
}
function partition(arr, left, right) {
let i = left;
let j = right;
let pivotValue = arr[Math.floor(left + (right-left)/2)];
if (i<=j) {
while(arr[i] < pivotValue) {
i++
}
while(arr[j] > pivotValue) {
j++
}
if (i<=j) {
swap(arr,i,j);
i++;
j--;
}
}
return i;
}
function swap(arr,i,j){
[arr[i],arr[j]] = [arr[j],arr[i]];
}
复制代码
采用 QUIC 协议: HTTP/3 选择了一个折衷的方法——UDP 协议, 基于 UDP 实现了相似于 TCP 的多路数据流、传输可靠性等功能,咱们把这套功能称为 QUIC 协议
HTTP/3 中的 QUIC 协议集合了如下几点功能:
(参考上面的)
1.Xss: XSS 攻击就是黑客往页面中注入恶意脚本,而后将页面的一些重要数据上传到恶意服务器。 常见的三种攻击模式:1.存储型XSS攻击 2.反射性XSS攻击 3.基于DOM的XSS攻击
主要有三种防范策略: 第一种是经过服务器对输入的内容进行过滤或者转码, 第二种是充分利用好 CSP, 第三种是使用 HttpOnly 来保护重要的 Cookie 信息
2.Csrf(参看上面)