⚡Promise:异步的“承诺书”如何兑现?

 1const p = new Promise((resolve, reject) => {
 2  setTimeout(() => {
 3    Math.random() > 0.5 ? resolve("成功") : reject("失败");
 4  }, 1000);
 5});
 6p.then(console.log).catch(console.error);

📌 Promise 有 3 个状态

  1. pending:初始态,等待结果
  2. fulfilled:成功态,被 resolve
  3. rejected:失败态,被 reject

状态单向流动pending → fulfilledpending → rejected,不可逆 ❗ 58639f382ec7c23c70c993fea3d4846a.png ⚠️ 状态一旦改变,永不回头?


「Q1: Promise 状态变了,then 还能监听到吗?」
A1: 能!即使 resolve 在 then 之前,Promise 会“记住”结果,后续 then 依然执行(微任务队列机制)👉继续看?💡

「Q2: 多个 then 是串行还是并行?如果前一个 throw 错误会怎样?」
A2: then 链是串行微任务,前一个 throw 会跳到最近的 catch(类似 try-catch)💥

「Q3: 手写一个最简 Promise,只实现 resolve、then 和状态机制?」

 1function MyPromise(executor) {
 2  this.status = 'pending';
 3  this.value = null;
 4  this.onFulfilled = []; 
 5
 6  const resolve = (value) => {
 7    if (this.status === 'pending') {
 8      this.status = 'fulfilled';
 9      this.value = value;
10      this.onFulfilled.forEach(fn => fn()); 
11    }
12  };
13  executor(resolve, () => {}); 
14}
15MyPromise.prototype.then = function(onFulfilled) {
16  if (this.status === 'fulfilled') {
17    onFulfilled(this.value);
18  } else {
19    this.onFulfilled.push(() => onFulfilled(this.value)); 
20  }
21};

🤯 你能补全异步 resolve 的微任务调度吗?(用 queueMicrotask)

「Q4: Promise.all 如果其中一个 reject,其他请求会取消吗?如何实现“失败不中断”?」
A4: 会!除非用 Promise.allSettled.catch(() => null) 包装每个 Promise ✅

「Q5: Vue 的 nextTick 为什么用 Promise + MutationObserver 回退?说说事件循环优先级?」
A5: 因为 Promise 是微任务,比 setTimeout(宏任务)更快执行,保证 DOM 更新后立即回调 ⏱️


⚡闭包:函数的“私有保险箱”🧾

 1function outer() {
 2  let count = 0;
 3  return function inner() {
 4    return ++count; 
 5  };
 6}
 7const counter = outer();
 8counter(); 
 9counter(); 

📌 闭包 = 函数 + 外层作用域的引用
即使外层函数执行完,变量仍被“封闭”保留。

⚠️ 闭包一定导致内存泄漏?🚫


「Q1: 闭包的变量什么时候释放?」
A1: 当 inner 函数被销毁(如全局引用被置 null),没有引用指向它时,GC 才回收。

「Q2: 为什么循环中用 var + setTimeout 会输出 5 个 5?闭包如何解决?」

 1for (var i = 0; i < 5; i++) {
 2  setTimeout(() => console.log(i), 0); 
 3}
 4
 5for (var i = 0; i < 5; i++) {
 6  ((i) => setTimeout(() => console.log(i), 0))(i);
 7}

👉用 let 呢?块级作用域自动形成闭包!

「Q3: React Hooks 为什么依赖闭包?useEffect 里用旧 state 是闭包问题吗?」
A3: 是!每次渲染生成新函数,闭包捕获当次 state。过期闭包是常见 bug 源头 ❗

「Q4: 如何在 Vue 3 setup 中避免闭包陷阱?」
A4: 用 ref + .valuetoRefs,确保引用最新响应式数据 💡

「Q5: 闭包能实现模块化吗?写一个防篡改的计数器模块?」

 1const Counter = (function() {
 2  let count = 0;
 3  return {
 4    inc: () => ++count,
 5    get: () => count
 6  };
 7})();

面试官偷笑😏:这不就是 IIFE + 闭包的经典模式?


⚡ES6 新特性:不只是语法糖,是工程革命!

| 特性 | 作用 | 实战场景 | | --- | --- | --- | --- | | let/const | 块级作用域 | 避免 var 变量提升陷阱 | | arrow function | 无 this,更短语法 | 回调、map/filter | | destructuring | 解构赋值 | props、配置项提取 | | template string | 多行字符串 + 插值 | HTML 模板拼接 | | module (import/export) | ES 模块化 | 前端工程基石 | | Promise | 异步编程 | 接口请求链 | | class | 语法糖 | Vue/React 组件 | | async/await | 同步写法 | 复杂流程控制 | ```js |

function renderUser({ name = ‘匿名’, age, tags = [] } = {}) { return <div>${name}(${age}) - ${tags.join(',')}</div>; }

 1Q1: class 是真正的类吗和原型继承什么关系?」  
 2A1: 不是只是语法糖本质仍是 prototype。`class A {}` 等价于 `function A() {}` ❗
 3
 4「Q2: import 是静态的吗?动态导入怎么用?」  
 5A2: 是!必须在顶层。动态用 `import('./module.js')` 返回 Promise 💡
 6
 7「Q3: 为什么 ES6 模块是单例的?和 CommonJS 区别?」  
 8A3: 因为模块实例只加载一次,导出的是“绑定”而非值拷贝。修改 export 会影响所有导入者 🤯
 9
10「Q4: 装饰器(Decorator)是 ES6 吗?现在用在哪儿?」  
11A4: 不是 ES6,是提案。但广泛用于 TypeScript + NestJS、MobX 等框架 👉继续看?
12
13「Q5: 你项目中哪个 ES6 特性提升了可维护性?举个例子?」  
14A5: 解构 + 默认值让函数参数更清晰,减少 if 判断,代码自文档化 ✅
15
16* * *
17
18### ⚡SEO:不只是 meta 标签,是“搜索引擎恋爱学”💘
19
20```html
21<head>
22  <title>精准关键词 - 品牌名</title>
23  <meta name="description" content="150字内吸引点击的摘要">
24  <meta name="robots" content="index,follow">
25  <link rel="canonical" href="https://example.com/page">
26  <meta property="og:title" content="社交分享标题">
27</head>

📌 核心策略

  • 语义化 HTML(<header>, <article>
  • SSR / 预渲染(Vue/React 用 Nuxt/Next)
  • 图片懒加载 + alt 属性
  • 结构化数据(JSON-LD)
  • 移动友好 + 快速加载(Core Web Vitals)

「Q1: 客户端渲染(CSR)为什么不利于 SEO?」
A1: 爬虫可能拿不到动态内容,首屏 HTML 空白 ❌

「Q2: SSR 和 SSG 有什么区别?你项目用哪种?」
A2: SSR 每次请求生成 HTML,SSG 构建时生成。静态页用 SSG(如博客),动态用 SSR(如电商)✅

「Q3: 如何检测页面是否被正确索引?」
A3: Google Search Console 查“覆盖率”,或 site:yourdomain.com 搜索 🔍

「Q4: meta keywords 还有用吗?」
A4: 没用!搜索引擎早已忽略,专注内容和外链 💥

「Q5: 你做过 SEO 优化,数据提升多少?」
A5: 某项目从 SSR 改造后,首屏可交互时间 ↓60%,收录率 ↑90% 📈


⚡HTTP 状态码:服务器的“情绪报告”📊

状态码含义场景
200OK请求成功
301永久重定向域名迁移
302临时重定向A/B 测试
403禁止访问权限不足
404未找到页面删除
500服务器错误后端异常

「Q1: 301 和 302 对 SEO 有什么影响?」
A1: 301 会传递权重,302 不会。误用 302 可能导致 SEO 损失 ❗

「Q2: 403 和 401 有什么区别?」
A2: 401 是“未认证”(无 token),403 是“认证了但没权限”🔐

「Q3: 502、503、504 分别代表什么?」
A3: 502 Bad Gateway(网关错误),503 Service Unavailable(服务挂了),504 Gateway Timeout(超时)💥

「Q4: 如何优雅处理 404?前端路由怎么做?」
A4: Vue Router/React Router 配置 * 路由,显示自定义 404 页面 ✅

「Q5: 状态码是 HTTP/1.1 的吗?HTTP/2 有变化吗?」
A5: 状态码语义不变,但 HTTP/2 用二进制帧传输,效率更高 🚀


⚡缓存头:浏览器的“记忆宫殿”🏰

| 请求头 | 作用 | | --- | --- | --- | | Cache-Control | 缓存策略(如 max-age=3600) | | Expires | 过期时间(HTTP/1.0) | | ETag | 资源指纹,协商缓存 | | If-None-Match | 携带 ETag 询问是否变更 | | Last-Modified | 最后修改时间 | | If-Modified-Since | 携带时间询问 | ```http |

Cache-Control: public, max-age=31536000, immutable

 1👉 静态资源用强缓存 + 哈希文件名
 2
 3Q1: 强缓存和协商缓存有什么区别?」  
 4A1: 强缓存不发请求200 from memory/disk cache),协商缓存发请求问服务器304 Not Modified)✅
 5
 6Q2: ETag Last-Modified 哪个优先级高?」  
 7A2: ETag 更精确内容指纹),优先级更高 💡
 8
 9Q3: 如何让 CDN 缓存失效?」  
10A3: 改文件名hash)、 purge 请求设置短 TTL
11
12Q4: Cache-Control: no-cache 是不缓存吗?」  
13A4: 使用前必须验证”,实际会缓存但每次发请求问服务器 🤯
14
15Q5: 你项目中如何配置缓存策略?」  
16A5: HTMLno-cacheJS/CSSmax-age一年 + hashAPI根据业务设短缓存
17
18* * *
19
20### ⚡HTTPS加密的安全隧道”🔐
21
22ClientServer1\. Client Hello (支持的加密套件)2\. Server Hello + 证书3\. 验证证书 + 生成预主密钥4\. 加密发送预主密钥5\. 解密得到预主密钥6\. 双方用主密钥加密通信ClientServer
23
24⚠️ 证书如何验证
25
26* * *
27
28Q1: HTTPS 为什么安全解决了什么问题?」  
29A1: 防窃听加密)、防篡改完整性)、防冒充身份认证)✅
30
31Q2: SSL/TLS 握手过程中对称加密和非对称加密怎么配合?」  
32A2: 非对称加密 RSA预主密钥”,后续用对称加密 AES通信兼顾安全与性能 💡
33
34Q3: 什么是中间人攻击HTTPS 如何防范?」  
35A3: 攻击者伪造证书HTTPS 依赖 CA 机构签名浏览器验证证书链合法性
36
37Q4: 证书过期了会怎样如何自动续签?」  
38A4: 浏览器警告 Let's Encrypt + certbot 自动续签 👉继续看
39
40Q5: HTTP/2 必须用 HTTPS?」  
41A5: 不是必须但主流浏览器只支持 HTTPS HTTP/2 🚀
个人笔记记录 2021 ~ 2025