预计会遇到的Angular面试问题

作者 Aaron Cao · 更新于

预计会遇到的Angular面试问题
首先会问变更检测:什么会触发一次检查、OnPush改变了什么、以及signals如何融入其中。接着是依赖注入、RxJS操作符选择和订阅清理。大多数面试流程还会加入一个实操练习,通常是用service、debounceTime和switchMap构建的自动补全搜索。

首先会问变更检测:什么会触发一次检查、OnPush改变了什么、以及signals如何融入其中。接着是依赖注入、RxJS操作符选择和订阅清理。大多数面试流程还会加入一个实操练习,通常是用service、debounceTime和switchMap构建的自动补全搜索。

最常被问到的Angular概念是什么?

Angular的API面很大,网上流传的面试题清单常把每个装饰器都当成同等重要。实际并非如此。本节介绍真正决定大多数面试结果的领域,让你的练习更贴近真实分布。四大类问题占主导:

  • 变更检测:什么会触发检查、Zone.js如何为异步API打补丁、OnPush改变了什么,以及signals如何让Angular跳过某些工作。
  • 依赖注入:分层注入器、providedIn、注入令牌,以及inject()函数与构造函数参数的对比。
  • RxJS:observable与promise的对比、如何选择合适的操作符,以及在组件销毁前清理订阅。
  • 组件架构:独立组件、输入输出属性、内容投影,以及生命周期钩子。

版本意识在这里比在大多数框架面试中更重要,因为Angular改变了方向。独立组件、内置控制流块@if@for、可延迟视图,以及signals都是在近期主要版本中加入的,因此面试官常会问你现在会怎么写,与旧代码库的写法作对比。同时了解两者,并说明框架为何转向,比单纯站队更有说服力。

RxJS和signals相关问题会问到多深?

远不止操作符的名字。真正区分水平的RxJS问题是该选哪个扁平化操作符:switchMap会取消上一个内部请求,适合自动补全搜索;mergeMap并行执行所有请求;concatMap保持顺序;而exhaustMap会在有请求进行中时忽略新事件,因此适合提交按钮。接着面试官会问内存泄漏问题:手动订阅在组件销毁时会发生什么,以及为什么async pipe或takeUntilDestroyed能消除这个问题。

signals相关问题出现得较晚,通常从设计动机而非API本身问起。要能解释什么是signal、computed如何从中派生、effect的作用,以及为什么signals能让Angular以更细粒度的方式知道发生了什么变化,而不必重新检查整个组件树。一个好的回答会把两者联系起来:signals和OnPush都能减少变更检测的工作量,但signals是通过追踪读取来实现,而不是缩小检查触发的范围。

面试官并不指望你已经用过每一个新特性上线过项目。他们期待你说明自己最近使用的版本,并对其余部分做出清晰的推理。

应该预期哪些现场编程练习?

大多数Angular面试流程都包含在面试官注视下构建一个小功能。反复出现的练习在各家公司之间相当一致:

  • 在service中调用API,并用async pipe渲染结果。
  • debounceTimedistinctUntilChangedswitchMap构建自动补全搜索。
  • 编写带自定义校验器和可见错误状态的响应式表单。
  • 在父子组件之间传递数据,再把它提升到service中。
  • 添加一个带懒加载组件和守卫的路由。

举例来说,一位面试中级产品岗位的前端工程师可能会先构建自动补全搜索,然后被追问:响应乱序到达时会发生什么、如何展示加载状态、用户清空输入框时应该怎样处理。这些延伸问题才是决定面试结果的关键,因此要多练习这些追问,而不只是练顺利路径。Angular面试仍常以相邻题型开场,包括纯JavaScript和TypeScript基础,详见题库汇总

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

阅读问题清单只能建立辨识能力,而不是回忆能力,而面试考察的正是在有人注视下的回忆能力。解决办法是按面试真实形态反复练习:从空项目开始构建标准练习题,一边打字一边大声讲出你的变更检测和订阅决策,并在被打断时仍能不失去思路。把整套题目当作口头演练来练习,一次一题并附带追问,这正是模拟面试练习的用途。

有一点需要说清楚:Angular现场面试几乎总是在共享编辑器中进行,或者屏幕对面试官可见,屏幕上的一切面试官都能看到。助手适合用在准备阶段和以对话为主的面试环节,而不是共享屏幕上。哪些形式允许什么,详见面试类型

常见问题

还需要了解NgModules吗?

达到能读懂的程度就需要。仍有大量生产环境的Angular代码运行在NgModules上,因此要能回答一个模块声明了什么、providedIn如何取代了大多数provider数组。而关于新代码的问题会围绕独立组件展开,这是近期版本的默认方式。

AngularJS和Angular是同一个东西吗?

不是,面试官有时会特意确认这一点。AngularJS是1.x系列,使用scope、digest周期和controller。从版本2开始的Angular是基于TypeScript和组件的独立框架。如果职位描述写的是AngularJS,准备之前先确认对方指的是哪一个。

如果团队使用signals,还需要掌握多少RxJS?

仍然需要掌握很多。signals能很好地覆盖组件状态,但HTTP调用、路由事件和表单值流仍然是observable,因此操作符选择和清理仍会不断被问到。团队通常两者都用,说明各自适用场景是常见的高级问题。

面试官会问测试相关的问题吗?

通常是问测试策略,而不是死记API。要能说明你会在组件层面测试什么、与端到端测试的对比,TestBed如何搭建一个组件,以及如何伪造一个service。说清楚取舍比背出某个matcher更重要。

应该能讨论多少个Angular版本?

你实际用过的那个版本,加上此后发生的变化。面试官问独立组件、控制流块和signals,是因为这些答案能体现你的经验是否新。说明你最近上线用的版本,并对其余部分做出推理,就是一个完整的回答。

相关问题

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