人人都会AI编程

附录 C JavaScript 高频面试题与核心考点

更新时间:2026-07-11

本附录汇总了 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...offor...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 技术栈从基础到高级的核心知识领域。实际面试中,题目千变万化,但万变不离其宗——深入理解底层原理、结合工程实践,便能从容应对。