Appearance
ES6+ 与 TypeScript
ES6+ 和 TS 是现代前端的标配。面试考的是:let/const、箭头函数、解构、Promise、模块化、TS 的类型系统。
Q1: let、const、var 的区别? 「🟢 校招/初级」
考察点:作用域和变量提升。
参考答案:
var:函数作用域,存在变量提升(声明提前,赋值不提前),可重复声明。let:块级作用域,不存在变量提升(暂时性死区 TDZ),不可重复声明。const:块级作用域,声明时必须初始化,不可重新赋值(但对象/数组的内容可修改)。- 最佳实践:默认用 const,需要重新赋值时用 let,不用 var。
追问延伸:
- 暂时性死区(TDZ)是什么?
const obj = {}; obj.name = 'test'为什么不报错?
Q2: 箭头函数和普通函数的区别? 「🟢 校招/初级」
考察点:箭头函数的语义差异。
参考答案:
- 没有自己的
this,继承外层作用域的 this(词法绑定)。 - 不能用作构造函数(不能
new)。 - 没有
arguments对象(用 rest 参数...args替代)。 - 没有
prototype属性。 - 不能用作 Generator 函数。
追问延伸:
- 箭头函数的 this 在定义时确定还是在调用时确定?(定义时)
- 对象方法用箭头函数会有什么问题?
Q3: 解构赋值的应用场景? 「🟢 校招/初级」
考察点:ES6 语法糖的实用性。
参考答案:
- 数组解构:
const [a, b, ...rest] = [1, 2, 3, 4]; - 对象解构:
const { name, age = 18 } = user; - 函数参数解构:
function greet({ name, age }) { ... } - 交换变量:
[a, b] = [b, a] - 默认值:解构时可指定默认值,避免 undefined。
追问延伸:
- 嵌套解构怎么写?
- 解构时默认值在什么情况下生效?(值为 undefined 时)
Q4: Promise、Generator、async/await 的关系? 「🟡 中级」
考察点:异步编程的演进脉络。
参考答案:
- Promise:解决回调地狱,链式调用但仍有
.then嵌套。 - Generator:
function*+yield,可暂停执行;配合 co 库可自动执行异步。 - async/await:Generator 的语法糖,内置执行器;代码更直观,错误处理用 try/catch。
- 本质:async/await 基于 Promise,Generator 是底层机制。
追问延伸:
- async 函数的返回值是什么类型?
- await 只能用在 async 函数里吗?(ES2022 支持顶层 await)
Q5: ES Module 和 CommonJS 的区别? 「🟡 中级」
考察点:模块化规范。
参考答案:
- CommonJS:Node.js 默认,
require同步加载,运行时加载(拿到的是值的拷贝);适合服务端。 - ES Module:
import/export,编译时静态分析,支持 Tree Shaking;值是只读引用,实时绑定。 - 差异:CJS 是运行时加载,ESM 是编译时确定依赖关系;ESM 支持按需导入,CJS 只能整体导入。
追问延伸:
- Tree Shaking 的原理是什么?
- 为什么 Node.js 从 CommonJS 迁移到 ESM 很困难?
Q6: TypeScript 的类型系统有什么优势? 「🟡 中级」
考察点:TS 的核心价值。
参考答案:
- 静态类型检查:编译时发现错误,减少运行时 bug。
- 类型推断:大部分场景不需要显式标注类型。
- 接口与泛型:定义清晰的契约,提高代码可读性和可维护性。
- IDE 支持:自动补全、跳转定义、重构更安全。
- 类型体操:高级类型(Conditional Types、Mapped Types)可实现复杂类型转换。
追问延伸:
interface和type有什么区别?any、unknown、never分别是什么?
Q7: Proxy 和 Reflect 的应用场景? 「🟡 中级」
考察点:元编程能力。
参考答案:
- Proxy:拦截对象操作(get/set/has/delete 等),实现响应式、数据校验、日志记录。
- Reflect:提供与 Proxy 对应的默认行为,保证正确的语义(如
Reflect.get会触发 getter)。 - Vue 3 的响应式系统用 Proxy 替代 Object.defineProperty,支持数组、新增属性等场景。
追问延伸:
- Proxy 和 Object.defineProperty 的区别?
- 怎么用 Proxy 实现数据校验?