原型和原型链的理解

每个函数都有一个原型(prototype

每个对象(prototype也是对象)都有__proto____proto__指向该函数的构造函数的prototype

当a(对象)访问a.name时,会先去找自身有没有name,没有就会通过__proto__找上层的prototype中有没有name,还是没有继续上向找,这个过程就是原型链

实例.__proto__ → 构造函数.prototype → Object.prototype → null

防抖和节流的理解、区别和实现

防抖是”第一次或最后一次说了算”

节流是”每隔一段时间执行一次”

宏任务和微任务

异步任务的两个类型:

常用的 promise 就是微任务

setTimeout,requestAnimationFrame 就是宏任务

执行顺序: 同步代码 → 微任务队列清空 → 一个宏任务 → 微任务队列清空 → 下一个宏任务……

登录鉴权方案

JWT(JSON Web Token)

登录返回token,每次请求都带上,过期就用长期token刷新请求token

Session方案:

服务端存储会话,客户端只存sessionId,过期就401或重定向到登录。

requestAnimationFrame和setTimeout / setInterval

rAF用来制作动画,使用定时器会有不精确的时间间隔,过度消耗性能。导致掉帧,卡,浪费资源。

rAF主要用于(滚动监听、Canvas 绘图、DOM 动画、游戏循环),且是唯一的最佳选择

重放攻击

攻击拿到完整的Curl,重复的请求发送,导致数据或服务出现问题。

常见手段:

  • 时间有效期
  • 一次随机数
  • 时间 + 随机数 + 签名
  • https(加密传输)

浏览器到页面生成完整过程

  1. DNS解析(本地缓存,再系统hosts,最后问DNS服务器)
  2. TCP三次握手,HTTPS还需要TLS握手
    1. 你好 → 你好我也好(HTTPS返回加密方式) → 开始
  3. HTTP请求
  4. 返回HTML并处理
  5. 浏览器解析HTML
    1. 构建DOM
    2. CSS到CSSDOM 加 <head> 防止阻塞
    3. <SCRIPT> 加 defer/asyn 防止阻塞
  6. DOM+CSSDOM 生成树
  7. 计算位置和尺寸
  8. 绘制到屏幕上
  9. 合成,图层以合并输出画面

闭包

一个函数能够记住并访问它自己和它周围的变量,即使它已经离开了出生地(return了),就是闭包。

闭包使函数拥有了“记忆力”。

常见场景:

  1. 防抖/节流
  2. 私有变量
  3. 函数工厂,根据参数返回不同的结果和做不同的事件
  4. 缓存/记忆函数,避免重复计算

闭包会让变量不被垃圾回收,用完要注意释放,避免内存泄漏。常见就是removeEventListener和clearInterval

onMounted(() => {
  const timer = setInterval(() => {
    console.log('running')
  }, 1000)

  // 组件销毁时没清除定时器 → 内存泄漏
  // ✅ 应该在 onUnmounted 里清除
  onUnmounted(() => clearInterval(timer))
})


function bindEvent() {
  const bigData = new Array(100000).fill('数据')

  function handleClick() {
    console.log(bigData)
  }

  const btn = document.getElementById('btn')
  btn.addEventListener('click', handleClick)

  // 用完后移除监听器,闭包引用断开,bigData 可以被回收
  return function cleanup() {
    btn.removeEventListener('click', handleClick)
  }
}

const cleanup = bindEvent()
// 不需要时调用
cleanup()

深拷贝和浅拷贝

浅拷贝:只复制对象的第一层

深拷贝:所有层级都复制,且是独立的新对象,互不影响

1. JSON.parse简单暴力
JSON.parse(JSON.stringify(obj))

2. structuredClone
const deep = structuredClone(obj)

3. 递归
function deepClone(obj) {
  if notnull notobject
  const clone = Array.isArray(obj) ? [] : {}
	for(let key in obj) {
    if(obj.hasOwnProperty(key)) {
      clone[key] = deepClone(obj[key])
    }
  }
}

4. 生产项目用 lodash 

Vue2 和 Vue3 的核心区别

Vue 响应式原理

computed 和 watch 的区别

v-model 的原理 ⭐️待复习

Vue 生命周期及父子组件执行顺序

keep-alive 是什么

Vue 组件通信方式

Vue Router 导航守卫

hash 模式和 history 模式的区别

nextTick 是什么

ref 和 reactive 的区别

defineProps 和 defineEmits 的用法

defineExpose 是什么

watchEffect 和 watch 的区别

Teleport 是什么 ⭐️待复习

Suspense 是什么 ⭐️待复习

v-show 和 v-if 的区别

为什么 v-if 和 v-for 不建议一起用

Vue 中 key 的原理

什么是虚拟 DOM

作用域和作用域链

Promise、async/await 和事件循环

Vue3 相比 Vue2 的升级点

浏览器缓存机制 ⭐️待复习

CSS 垂直居中方法

CSS 样式优先级

如何防护 XSS 攻击 ⭐️待复习

后台权限管理如何设计 ⭐️待复习

首屏加载优化方案 ⭐️待复习

组件封装的理解和思路 ⭐️待复习

跨域是什么?如何解决

TypeScript 中 type 和 interface 的区别