前端广度面试题(从前端到全栈)

Q: 移动端 H5 点击有 300ms 延迟,该如何解决?

  • 背景:double tap to zoom
  • Fast Click(初期)
  • width=device-width

Q: Retina 屏幕的 1px 像素,如何实现?

  • 使用 css 伪类 + transform 来优化这一问题。即把默认的 1px 高度给压缩 0.5 倍
  • 如果有 border-radius,可以使用 box-shadow 设置

Q: HTTP 请求中token和cookie有什么区别?

cookie

  • HTTP 无状态,每次请求都要带 cookie,以帮助识别身份
  • 服务端也可以向客户端 set-cookie,cookie 大小限制 4kb
  • 默认有跨域限制:不可跨域共享、传递 cookie(前端设置 withCredentials,后端允许跨域设置具体url)
    设置cookie,只能在本域名下或者domain级别高于自身的域名下才会生效

现代浏览器开始禁止第三方 cookie

  • 和跨域不同。这里是:禁止网页引入的第三方 JS 设置cookie
  • 打击第三方广告,保护用户隐私
  • 新增属性 SameSite:Strict、Lax、None;值可自己选择

cookie 和 session

  • cookie 用户登录验证,存储用户标识(如 userId)
  • session 在服务端,存储用户详细信息,和cookie信息一一对应
  • cookie 和 session 是常见的登录验证解决方案

token vs cookie

  • cookie 是 HTTP 规范,而 token 是自定义传递
  • cookie 会默认被浏览器存储,而token需自己存储
  • token 默认没有跨域限制

JWT (JSON Web Token)

  • 前端发起登录,后端验证成功之后,返回一个加密的 token
  • 前端自行存储这个 token (其中包含了加密的用户信息)
  • 以后访问服务端接口,都带着这个token,作为用户信息

答案

  • cookie:HTTP标准,跨域限制;配合 session 使用
  • token:无标准,无跨域限制,用于JWT

Q: session 和 JWT 哪个更好?

session 优点

  • 原理简单,易于学习
  • 用户信息存储在服务端,可快速封禁某个用户

session 缺点

  • 占用服务端内存,硬件成本高
  • 多进程,多服务器时,不好同步——需使用第三方缓存,如 redis
  • 默认有跨域限制

JWT 优点

  • 不占用服务端内存
  • 多进程、多服务器 不受影响
  • 没有跨域限制

JWT 缺点

  • 用户信息存储在客户端,无法快速封禁某个用户
  • 万一服务端秘钥被泄露,则用户信息全部丢失
  • token 体积一般大于 cookie,会增加请求的数据量

答案

  • 如有严格管理用户信息的需求(保密,快速封禁)推荐session
  • 如没有特殊要求,则使用 JWT (如初创网站)

Q: 如何实现 SSO 单点登录

基于 cookie

  • cookie 默认不可跨域共享,但有些情况下可设置为共享
  • 主域名相同,如 www.baidu.com、image.baidu.com
  • 设置 cookie domain 为主域名,即可共享 cookie

SSO

  • 主域名完全不同,则cookie无法共享
  • 可使用 SSO 技术方案
    请添加图片描述

Q: HTTP 协议和 UDP 协议有什么区别?

网络协议

  • HTTP 协议在应用层
  • TCP 和 UDP 协议在传输层
  • 所以应该拿 TCP 和 UDP 进行比较

TCP 协议

  • 有连接(三次握手)
  • 有断开(四次挥手)
  • 稳定传输

UDP 协议

  • 无连接,无断开
  • 不稳定传输,但效率高
  • 如视频会议、语音通话

Q: HTTP 协议 1.0 1.1 2.0 有什么区别?

HTTP 1.0

  • 最基础的 HTTP 协议
  • 支持基本的 GET POST 方法

HTTP 1.1

  • 缓存策略 cache-control E-tag 等
  • 支持长连接 Connection: keep-alive,一次 TCP 连接多次请求
  • 断点续传,状态码 206(大文件分片上传)
  • 支持新的方法 PUT DELETE等,可用于 Restful API

HTTP 2.0

  • 可压缩 header,减少体积
  • 多路复用,一次 TCP连接中可以多个HTTP请求并行请求
  • 服务端推送

Q: 什么是 HTTPS 中间人攻击?如何预防?

HTTPS 加密传输

  • HTTP 明文传输
  • HTTPS 加密传输 HTTP + TLS/SSL(非对称加密+对称加密)

中间人攻击 - 黑客伪造证书请添加图片描述

预防:使用正规厂商的证书,慎用免费的

Q: script 标签的defer 和 async 有什么区别?

请添加图片描述

  • 无:HTML 暂停解析,下载JS,执行JS,再继续解析 HTML
  • defer:HTML 继续解析,并行下载JS,HTML 解析完在执行 JS
  • async:HTML 继续解析,并行下载 JS,HTML 暂停解析,执行JS,再继续解析 HTML

Q: prefetch 和 dns-prefetch 分别是什么?

preload 和 prefetch 有关系

  • preload 资源在当前页面使用,会优先加载
  • prefetch 资源在未来页面使用,空闲时加载

请添加图片描述

dns-prefetch 和 preconnect 有关系

  • dns-prefetch 即 DNS 预查询
  • preconnect 即 DNS 预连接

答案

  • prefetch 是资源预获取(和 preload 有关)
  • dns-prefetch 是 DNS 预查询(和 preconnect 有关)

Q: 你知道哪些前端攻击?该如何预防?

XSS

  • Cross Site Script 跨站脚本攻击
  • 手段:黑客将 JS 代码插入到网页内容中,渲染时执行 JS 代码
  • 预防:特殊字符替换(前端或后端)
  • vue 的 v-html 和 react 的 dangerouslySetInnerHTML 是原生渲染的,会造成 xss 攻击

CSRF

  • Cross Site Request Forgery 跨站请求伪造
  • 手段:黑客诱导用户去访问另一个网站的接口,伪造请求
  • 预防:严格的跨域限制(如判断 referrer 请求来源;为 cookie 设置 SameSite,禁止跨域传递cookie) + 验证码机制

点击劫持

  • Click Jacking
  • 手段:诱导界面上蒙一个透明的 iframe ,诱导用户点击
  • 预防:让 iframe 不能跨域加载
    判断跳转域名是否一致
    设置X-Frame-Options: sameorigin(防止加载到第三方 iframe)
    请添加图片描述

DDOS

  • Distribute denial-of-service 分布式拒绝服务
  • 手段:分布式的、大规模的流量访问,是服务器瘫痪
  • 预防:软件层不好做,需要硬件预防(如阿里云 WAF)

SQL 注入

  • 手段:黑客提交内容时写入 SQL 语句,破坏数据库
  • 预防:处理输入的内容,替换特殊字符

Q: websocket 和 HTTP 协议有什么区别?

WebSocket

  • 支持双端通讯
  • 可以由 client 发起,也可以由 server 发起
  • 用户:消息通知,直播间讨论区,聊天室,协同编辑

WebSocket 连接过程

  • 发起一个 HTTP 请求
  • 成功之后在升级到 WebSocket协议,再通讯

WebSocket 和 HTTP 区别

  • WebSocket 协议名是 ws:// 或者 wss://,可双端发起请求
  • WebSocket 没有跨域限制
  • 通过 send 和 onmessage 通讯(HTTP 通过 req 和 res )

Q: WebSocket 和 HTTP 长轮询的区别

  • HTTP 长轮询:客户端发起请求,服务端阻塞,不会立即返回
    需要处理 timeout,即 timeout 之后重新发起请求
  • WebSocket:客户端可发起请求,服务端也可发起请求请添加图片描述

Q: 网页重绘 repaint 和 重排 reflow 有什么区别?

动态网页,随时都会重绘、重排

  • 网页动画
  • Modal Dialog 弹窗
  • 增加/删除一个元素,显示/隐藏一个元素

重绘

  • 元素外观改变,如颜色、背景色
  • 但元素的尺寸、定位不变,不会影响其他元素的位置

重排

  • 重新计算尺寸和布局,可能会影响其他元素的位置
  • 如元素高度增加,可能会使相邻元素位置下移

区别

  • 重排比重绘要影响更大,消耗也更大
  • 所以,要尽量避免无意义的重排

减少重排的方法

  • 集中修改样式,或直接切换 css class
  • 修改之前先设置 display: none,脱离文档流
  • 使用 BFC 特性,不影响其他元素位置
  • 频繁触发(resize scroll)使用节流和防抖
  • 使用 createDocumentFragment 批量操作 dom
  • 优化动画,使用 CSS3 和 requestAnimationFrame

扩展 BFC

  • Block Format Context 块级格式化上下文
  • 内部的元素无论如何改动,都不会影响其他元素的位置

触发 BFC 的条件

  • 根节点
  • float: left/right;
  • overflow: auto/scroll/hidden
  • display: flex/grid; 的直接子元素
  • position: absolute/fixed;

Q: 如何统一监听Vue组件报错?

  • errorCaptured 监听下级组件错误,返回false阻止向上传播(监听一些重要、有风险组件的错误)
  • errorHandler 监听全局Vue组件的错误(候补全局监听)
  • window.onerror 监听其他JS错误,如异步(候补全局监听)

Q: 如何统一监听React组件报错?

  • ErrorBoundary 监听组件渲染报错
    监听所有下级组件报错,可降级展示 UI
    只监听所有组件渲染时报错,不监听 DOM 渲染、异步报错
    只在 production 环境生效,dev 会直接报错
  • 事件报错使用 try-catch 或 window.onerror
  • 异步报错使用 window.onerror
  • Promise 未处理的 catch 需要 onunhandledrejection 监听

Q: new 一个对象的过程是什么?

  • 创建一个空对象,继承 constructor 的原型
  • 将 obj 作为 this 执行 constructor ,并传入参数
  • 返回 obj
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值