本附录汇总了 JavaScript 技术栈中高频出现的面试题目与核心考点,覆盖从基础语法到高级原理,从浏览器特性到手写实现。每个题目都提炼了关键考察点,供读者快速自测与查漏补缺。
C.1 数据类型与类型转换
1. JavaScript 有哪些数据类型?如何判断数据类型?
- 核心考点:基本类型与引用类型的区分,typeof、instanceof、Object.prototype.toString.call() 的适用场景与局限性。
2. == 与 === 的区别?[] == false 的结果是什么?
- 核心考点:隐式类型转换规则,相等运算符的抽象比较流程。
[] == false结果为true,涉及数组转字符串再转数字的过程。
3. 什么是暂时性死区?let/const 与 var 的区别?
- 核心考点:变量提升、块级作用域、暂时性死区(TDZ)、const 不可变的本质(引用类型内部属性仍可修改)。
4. 0.1 + 0.2 !== 0.3 是为什么?如何解决?
- 核心考点:浮点数精度问题,IEEE 754 标准,解决方案(转换成整数运算或使用 toFixed)。
5. typeof null 为什么返回 "object"?
- 核心考点:历史遗留问题,底层二进制标记方式。
C.2 作用域、闭包与执行上下文
6. 什么是闭包?举例说明闭包的实际应用场景。
- 核心考点:闭包的成因(词法作用域 + 函数内部引用外部变量),应用场景:数据私有化、函数工厂、防抖节流、模块封装。易错点:闭包引发的内存泄漏。
7. 解释变量提升与函数提升的规则,谁优先级更高?
- 核心考点:函数提升优先级高于变量提升,同名函数会覆盖,但变量赋值会覆盖函数声明。
8. 执行上下文有哪些类型?创建过程发生了什么?
- 核心考点:全局上下文、函数上下文、Eval 上下文,创建阶段(变量对象/词法环境、作用域链、this 绑定)与执行阶段。
9. 作用域链是如何形成的?闭包与作用域链的关系?
- 核心考点:词法作用域、
[[Scopes]]属性,闭包本质是在更长的作用域链上查找变量。
C.3 原型与继承
10. 原型链是什么?instanceof 的原理?
- 核心考点:
proto指针、prototype属性的区别,instanceof沿着原型链向上遍历检查。
11. JavaScript 如何实现继承?多种方案对比。
- 核心考点:原型链继承、构造函数继承、组合继承、寄生组合继承、ES6 class extends 的底层(寄生组合)。优缺点:构造函数继承无法复用方法,原型链继承引用值共享,组合继承调用两次父类构造函数。
12. Object.create(null) 创建的对象有什么特点?
- 核心考点:没有原型链,没有继承自 Object 的原型方法,适合做纯粹的键值存储(如字典)。
13. class 是语法糖吗?它与原型继承的对应关系?
- 核心考点:class 方法定义在原型上,静态方法定义在构造函数上,
super编译后等价于Parent.call(this)+ 原型连接。
C.4 this 绑定机制
14. this 指向的四种规则是什么?优先级如何?
- 核心考点:默认绑定(严格模式下 undefined)、隐式绑定、显式绑定(call/apply/bind)、new 绑定,优先级:new > 显式 > 隐式 > 默认。注意箭头函数无视这些规则。
15. 箭头函数中的 this 与普通函数有何区别?
- 核心考点:箭头函数没有 own this,this 继承自外层词法作用域,不适合做构造函数,没有 arguments 对象。
16. 手写 call / apply / bind 的实现。
- 核心考点:属性挂载到临时对象、删除临时引用、处理 null 情况、bind 返回函数需支持 new(优先级)。
C.5 事件循环与异步编程
17. 简述浏览器的事件循环机制。宏任务与微任务有哪些?
- 核心考点:调用栈、任务队列,宏任务:script、setTimeout、setInterval、I/O、UI 渲染;微任务:Promise.then、MutationObserver、queueMicrotask。每轮事件循环先清空一个宏任务,再清空所有微任务。
18. 以下代码的输出顺序是什么?
console.log(1);
setTimeout(() => console.log(2), 0);
Promise.resolve().then(() => console.log(3));
console.log(4);
- 核心考点:主线程同步代码 → 微任务队列 → 宏任务队列。输出 1,4,3,2。注意宏任务需等微任务清空后才执行。
19. async/await 的原理?如何捕获错误?
- 核心考点:async 函数返回 Promise,await 相当于
Promise.resolve(value)的语法糖,后面代码作为微任务执行。错误可用 try/catch 捕获,或.catch()。
20. Promise 的三个状态,如何实现链式调用?
- 核心考点:pending → fulfilled/rejected,状态不可逆,then/catch 返回新的 Promise,回调返回值决定新 Promise 状态。
21. 如何处理并发限制?如 5 个请求,但最多同时发 3 个。
- 核心考点:使用递归或队列实现控制并发数,结合 Promise.all 或自定义调度器。
C.6 ES6+ 核心特性
22. 解构赋值有哪些用法?注意事项?
- 核心考点:数组解构按位置,对象解构按同名属性,可设置默认值,嵌套解构,函数参数解构。注意解构
null/undefined会报错。
23. Map 与 Object 的区别,何时使用 Map?
- 核心考点:Map 的 key 可以是任意类型(对象、函数等),有序,有 size 属性,迭代更友好,适合频繁增删键值对或非字符串键的场景。
24. Set 如何实现数组去重?[...new Set(arr)] 的局限?
- 核心考点:Set 只能去重基本类型,引用类型无法去重(内存地址不同)。NaN 在 Set 中被视为相等。
25. for...of 与 for...in 的区别?
- 核心考点:
for...of遍历可迭代对象(数组、Map、Set、字符串等),取值。for...in遍历对象可枚举属性(包括原型链),取键。
26. Symbol 的作用是什么?应用场景?
- 核心考点:创建唯一标识,防止属性名冲突,可用于定义私有属性(约定),内置 Symbol(如 Symbol.iterator)定制迭代器。
27. 模块化:CommonJS 与 ESM 的核心区别?
- 核心考点:CommonJS 是运行时加载、输出值的拷贝;ESM 是编译时加载、输出值的引用(只读),支持静态分析、Tree Shaking。
C.7 DOM、BOM 与浏览器
28. 事件流三阶段是什么?事件委托的原理与优势?
- 核心考点:捕获阶段、目标阶段、冒泡阶段,
addEventListener第三个参数控制。事件委托利用事件冒泡,将子元素事件绑定到父元素,减少内存消耗,支持动态节点。
29. 什么是重排(回流)与重绘?如何减少?
- 核心考点:重排即布局改变(几何属性变化),重绘即样式改变(不影响几何属性)。优化:批量修改 DOM(DocumentFragment)、脱离文档流修改、使用类名替换、利用 CSS3 动画(合成层)。
30. 前端跨域解决方案有哪些?
- 核心考点:同源策略限制,CORS(服务端设置响应头),JSONP(仅 GET),代理(Nginx 反向代理、Node 中间件),postMessage(跨窗口通信)。
31. Cookie、localStorage、sessionStorage、IndexedDB 的对比。
- 核心考点:容量限制、生命周期、作用域、通信方式(Cookie 自动携带),安全属性(HttpOnly、Secure、SameSite)。
32. 解释一下防抖与节流,并手写实现。
- 核心考点:防抖:延迟执行,期间再次触发重新计时;节流:固定频率执行一次。应用场景:输入联想(防抖)、滚动加载(节流)。
C.8 性能优化与内存管理
33. 常见内存泄漏场景及排查方法。
- 核心考点:意外全局变量、未清除的定时器/回调、闭包引用旧变量(DOM 泄漏)、遗忘的 Map/Set。Chrome DevTools 的 Memory 面板快照与时间线分析。
34. 如何优化首屏加载?
- 核心考点:资源压缩/合并、路由懒加载、图片懒加载、SSR/预渲染、CDN 加速、关键 CSS 内联、骨架屏/loading 过渡。
35. 长列表优化方案?虚拟列表的原理。
- 核心考点:只渲染可视区域内的 DOM 节点,通过计算偏移量和占位元素模拟滚动,减少 DOM 节点数量,提升渲染性能。
C.9 手写代码高频题
36. 手写深拷贝(考虑循环引用、多种数据类型)。
- 核心考点:递归遍历,处理数组、对象、Date、RegExp、Map、Set 等,使用 WeakMap 记录已复制对象以解决循环引用。
37. 手写 Promise(符合 A+ 规范)。
- 核心考点:状态管理、then 的链式调用、回调队列、异步执行、用 resolvePromise 处理返回值与重复解析。
38. 手写 new 操作符的实现。
- 核心考点:创建一个空对象并链接原型、执行构造函数并绑定 this、根据返回值类型决定最终对象。
39. 手写 instanceof。
- 核心考点:沿着
proto链向上查找,直到找到匹配的原型对象或到达 null。
40. 实现一个数组扁平化(flat)函数,可指定深度。
- 核心考点:递归或
reduce+concat,利用Array.isArray判断。也可用JSON.stringify变换(不推荐)。
41. 实现函数柯里化 / 偏函数。
- 核心考点:利用闭包累计参数,返回函数判断参数数量是否足够,足够时执行原函数。
42. 实现一个简易的事件发布订阅(EventEmitter)。
- 核心考点:维护事件名-回调列表的映射,支持 on、emit、off、once。
C.10 综合与设计题
43. 前端路由的原理(hash 模式与 history 模式)。
- 核心考点:hash 模式监听
hashchange事件,路径以#起始,不会发 HTTP 请求;history 模式使用pushState/replaceState+popstate,需服务端配置统一入口避免 404。
44. 解释观察者模式与发布订阅模式的区别,并给出前端应用。
- 核心考点:观察者模式中 Subject 和 Observer 直接耦合,发布订阅有事件中心解耦。前端应用:Vue 响应式是观察者模式的变体(Dep 收集 Watcher);事件总线是发布订阅模式。
45. 实现一个带并发限制的异步调度器。
- 核心考点:递归执行任务,维护运行状态数和等待队列,很像前面并发限制题目,需要处理 Promise 和回调。
46. 虚拟 DOM 的 diff 算法核心思路。
- 核心考点:同层比较,根据 key 区分节点,节点类型不同直接替换,相同则更新属性、递归 diff 子节点(头尾指针等优化)。
47. 前端登录的实现流程与安全考量。
- 核心考点:JWT vs Session 方案,前端存储 Token 的安全位置(HttpOnly Cookie),防止 XSS/CSRF 攻击的实践。
以上题目涵盖 JavaScript 技术栈从基础到高级的核心知识领域。实际面试中,题目千变万化,但万变不离其宗——深入理解底层原理、结合工程实践,便能从容应对。