JavaScript 面试常见问题

作者 Aaron Cao · 更新于

JavaScript 面试常见问题
预期会考察基础知识:闭包、事件循环、this 绑定、原型,以及用 var、let、const 进行作用域管理。然后是编程题,例如实现 debounce、展平数组,或编写一个 promise 工具函数,还包括事件委托等浏览器相关话题。高级岗位的面试还会加入 async 模式和性能相关内容。

预期会考察基础知识:闭包、事件循环、this 绑定、原型,以及用 var、let、const 进行作用域管理。然后是编程题,例如实现 debounce、展平数组,或编写一个 promise 工具函数,还包括事件委托等浏览器相关话题。高级岗位的面试还会加入 async 模式和性能相关内容。

最常被问到的 JavaScript 基础知识有哪些?

JavaScript 的问题清单看似无穷无尽,逐个刷随机题目是最慢的攻克方式。这一节把范围收窄到面试官几乎每一轮都会问到的概念,让你的练习真正对应实际分布。以下五个主题覆盖了大多数筛选面试:

  • 闭包:函数捕获了什么、经典的循环变量 bug,以及模块模式为何有效。
  • 事件循环:调用栈、任务队列和微任务队列,以及在一个混合示例中日志的打印顺序。
  • this 绑定:默认绑定、隐式绑定、用 call 和 apply 的显式绑定,以及箭头函数有何不同。
  • 原型:沿原型链的属性查找,以及 class 语法编译后的样子。
  • 作用域:var 与 let、const 的区别、变量提升,以及暂时性死区。

用 == 与 === 的相等性强制转换、真值判断,以及 map、filter、reduce 等数组方法,构成了筛选环节的其余部分。如果你能在一分钟内把上面每一项都口头讲清楚,基础知识这一关就稳了。

应该练习哪些编程题?

除了概念性问题,大多数 JavaScript 面试环节还包括一个现场完成的简短实现练习。这类题目就那么几种,值得反复练到每道题只需几分钟、而不是要试好几次:

  • 实现 debouncethrottle,并说明各自适用的场景。
  • 不用递归和用递归两种方式展平嵌套数组。
  • 编写一个简化版的 Promise.all,要求在第一次失败时就 reject。
  • 用 on、off、emit 构建一个小型事件发射器。
  • 深拷贝一个对象,并说出你的实现遗漏了哪些情况。

举例来说,一位应聘中级职位的前端候选人,可能会先被要求实现 debounce 作为热身,接着被要求把它接到一个搜索输入框上,并解释正在进行中的请求会发生什么。真正的考验在追问环节;面试官会不断延伸这道题,看看你对这门语言的理解到哪里为止。

对着一个会追问、会反驳的面试官大声练习,才是让这些内容真正记住的方法;模拟面试页面介绍了如何进行带计时和追问的练习环节。

浏览器和 async 相关问题是什么样的?

面向浏览器的岗位会在语言基础之上再加一层内容。事件委托是核心:为什么在父元素上挂一个监听器胜过在每个子元素上各挂一个、事件冒泡是如何实现这一点的,以及捕获阶段在什么时候起作用。DOM 更新批处理、布局抖动,以及什么会触发重排,也会出现在偏性能方向的筛选环节中。

Async 相关问题已经收敛成一种固定套路:一段混合了 setTimeout、promise 链和 async 函数的代码,让你预测输出顺序。答案取决于微任务与宏任务的执行顺序,面试官在意的是原因,而不只是顺序本身。跨越 await 边界的错误处理、promise 链式调用与嵌套的对比,以及用 Promise.race 让多个请求赛跑,则补齐了这一类题目。

这些环节在编码、行为面试和系统设计等不同形式中有何区别,在面试类型枢纽页中有介绍。

怎样练习才能真正用到实际面试中?

看答案会让人感觉很有收获,但实际几乎没用。真正的面试是要开口说、有时间限制、还要互动的,所以练习也必须是这样。做模拟练习时,一边打字一边讲解,被追问打断,还要卡着时间;正是这种压力,才能让你把知识变成条件反射。其他语言和技术栈的针对性题库见题库枢纽页。

说句实话:真正的 JavaScript 面试通常是在共享编辑器里进行的,你的屏幕全程可见,监考评估还会全程录制。AI 助手是用来提前准备和练习的,不是用在实时共享的屏幕上。而在合法使用实时协助的场景——比如未共享屏幕的电话面试,或者你自己的准备环节——SubcueAI 的悬浮窗只留在你自己的设备本地,不会有机器人加入通话。

常见问题

JavaScript 面试就是考 LeetCode 题目吗?

通常不是。虽然也会出现通用算法题,但 JavaScript 专项环节更侧重语言机制,比如闭包、事件循环和 this 绑定,再加上 debounce 或事件发射器这类小型实用实现题。

初级开发者应该优先关注什么?

作用域、闭包、数组方法,以及能清楚讲明白 == 和 === 的区别。初级候选人在筛选环节挂掉,更多是因为基础不牢,而不是因为不懂 generator 或 proxy 这类进阶话题。

怎样用简单的方式解释事件循环?

一句话概括:同步代码在调用栈上运行,执行完的回调会在队列里等待,每次调用栈清空后,引擎会先清空所有微任务(比如 promise 回调),然后才处理下一个宏任务(比如定时器)。接着用一个日志顺序的例子走一遍。

JavaScript 面试会考 TypeScript 吗?

如果团队在用 TypeScript,这种情况正变得越来越常见。可以预期会问基础类型标注、联合类型、够用水平的泛型,以及 TypeScript 在运行时到底能保证什么、不能保证什么。JavaScript 基础功底仍然决定这一环节的结果。

相关问题

← 更多关于 按岗位与主题分类的面试问题