Skip to content

面试题

浏览器和协议

输入url到页面加载的过程

  • DNS域名解析
  • 建立TCP连接
  • 发送HTTP请求
  • 服务器返回相应
  • 浏览器渲染

三次握手与四次挥手

TCP协议是面向连接、可靠的数据传输协议(按顺序、不丢失、不重复)

三次握手(建立连接)

  • 客户端发送报文SYN(听得到吗?)
  • 服务器接收报文并向客户端发送报文SYN+ACK(听得到,你说)
  • 客户端接收报文ACK(好,我开始说了)

为什么不是两次

  • 防止失效的连接又传递过来

四次挥手(断开连接)

  • 客户端发送报文FIN,停止发送数据(我要走了)
  • 服务器接收报文,发送确认报文ACK(好的,我知道了)
  • 服务器发送结束报文FIN(我也要走了)
  • 客户端接收结束报文,发送确认报文ACK,等待2MSL后关闭连接(好的,你走吧)

为什么不是三次

  • 二三次之间会有未发送完的数据

为什么等待2MSL

  • 确保最后一个ACK到达服务器
  • 防止之前的报文干扰

HTTP与HTTPS

特性HTTPHTTPS
协议TCPSSL/TLS
端口80443
安全性明文传输密文传输
身份认证CA数字证书
SEO不占优排名优先
性能不安全安全
开销连接更快连接更慢

跨域问题

同源:协议、域名、端口相同

跨域:脚本请求非同源的资源

为何跨域

  • 浏览器防止跨站脚本XSS恶意请求

解决跨域

  • 跨域资源共享CORS,响应头中添加特定字段
plain
// 请求头
Origin: https://www.taobao.com

// 响应头 (服务器设置)
Access-Control-Allow-Origin: https://www.taobao.com // 或使用 * 允许任何源(但不能带凭证)
plain
app.use((req, res, next) => {
  // 允许来自所有域的请求(生产环境应指定具体域名,如:https://www.taobao.com)
  res.header('Access-Control-Allow-Origin', '*');
  // 允许的请求方法
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  // 允许的请求头
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');

  // 处理预检请求
  if (req.method === 'OPTIONS') {
    return res.sendStatus(200);
  }
  next();
});
  • 反向代理,服务器转发(不会被拦截)
plain
// vite.config.js
export default {
  server: {
    proxy: {
      '/api': { // 以 /api 开头的请求
        target: 'https://api.target.com', // 目标服务器
        changeOrigin: true, // 修改请求头中的 Origin 为目标地址
        rewrite: (path) => path.replace(/^\/api/, '') // 重写路径(可选)
      }
    }
  }
}
plain
// nginx
server {
  listen 80;
  server_name www.taobao.com;

  location /api/ { # 匹配 /api 路径的请求
    proxy_pass https://api.target.com/; # 转发到目标服务器
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

服务器返回码

4xx找前端,5xx找后端

状态码简义含义
100继续请求服务器已接收到部分请求,等待剩下的部分继续请求
101切换协议客户端请求切换协议,服务器已准备切换协议
200请求成功客户端请求的数据服务器已成功返回
201创建成功客户端请求成功且服务器已创建新的资源
202接受请求服务器已接受请求,但尚未处理
203非授权信息服务器处理成功,但返回内容源于其他
204没有内容服务器处理成功,但是没有任何返回
205内容重置服务器处理成功,内容无返回,请求重置文档内容
206部分内容服务器成功处理了部分get请求
300多种选择服务器可以执行多个操作,或者根据返回列表客户端选择进行操作
301永久移动请求的资源已永久移动到其他位置,服务器自动修改请求资源的位置
302临时移动服务器响应的资源非在客户端请求的位置,但是可以响应该请求
303访问其他位置服务器自动(除 HEAD 之外)请求的其他位置
304未修改上次访问服务器的资源没有改变
305使用代理客户端使用代理访问服务器
307临时重定向客户端的要求服务器临时修改当前访问资源位置
400请求错误服务器无法解析该请求
401未授权客户端请求的资源没有进行身份验证,或未请求权限
403拒绝请求客户端发起的请求被服务器拒绝
404未找到没有找到请求的网页地址或请求的地址不存在
405方法禁用客户端请求的方法被禁用
406无法请求无法使用请求的内容特性响应请求的网页
407缺少代理授权客户端请求应使用代理或需要代理的授权
408请求超时服务器等候请求超时
409存在冲突服务器返回字段存在冲突,或返回的列表差异过大
410已删除请求资源已删除,请求资源以前有而现在没有
411标头字段无效服务器不接受不含有效内容长度标头字段的请求
412条件未满足服务器未满足请求者在请求中设置的其中一个前提条件
413请求体超标服务器无法处理超标(占用内存太大)的请求,超出了服务器的处理范围
414URI超标请求的 URI超标,服务器无法解析
415不支持请求请求的格式不受请求页面的支持
416不在请求范围页面无法提供请求的范围
417请求头未满足条件服务器没有按要求请求标头字段
500服务器内部错误服务器无法完成请求
501未完成请求服务器问题,没有完成请求,并非请求问题
502网关错误服务器配置的网关可能存在问题,无法接收信息
503服务器不可使用服务器正处于维护阶段或暂停服务
504网关超时网关没有及时未回应,上游没有接收到信息
505HTTP协议不支持当前请求的HTML版本与服务器不一致或服务器不支持当前请求的HTML版本

HTML

HTML语义化标签有哪些

  • header 头部
  • nav 导航栏
  • section 区块
  • main 主要区域
  • article 文章
  • aside 侧边栏
  • footer 底部

拖拽过程

plain
dragstart  // 开始拖动
drag       // 持续拖动
draend     // 拖动结束
dragenter  // 拖动进入目标
dragover   // 拖动到目标上方
dragleave  // 拖动离开目标
drop       // 松开鼠标

iframe的优缺点

CSS

盒模型

选择器

伪类和伪元素

如何水平居中

css特性

flex布局

grid布局

绘制三角形

清除浮动

css优化

css动画

JavaScript

数据类型

数据类型转换

数据类型判断

原型和原型链

作用域和作用域链

深拷贝和浅拷贝

闭包

设计模式

继承的实现方式

dom操作

ajax

宏任务和微任务

var与let的区别

普通函数与箭头函数