Skip to content

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 嵌套。
  • Generatorfunction* + 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 Moduleimport/export,编译时静态分析,支持 Tree Shaking;值是只读引用,实时绑定。
  • 差异:CJS 是运行时加载,ESM 是编译时确定依赖关系;ESM 支持按需导入,CJS 只能整体导入。

追问延伸

  • Tree Shaking 的原理是什么?
  • 为什么 Node.js 从 CommonJS 迁移到 ESM 很困难?

Q6: TypeScript 的类型系统有什么优势? 「🟡 中级」

考察点:TS 的核心价值。

参考答案

  • 静态类型检查:编译时发现错误,减少运行时 bug。
  • 类型推断:大部分场景不需要显式标注类型。
  • 接口与泛型:定义清晰的契约,提高代码可读性和可维护性。
  • IDE 支持:自动补全、跳转定义、重构更安全。
  • 类型体操:高级类型(Conditional Types、Mapped Types)可实现复杂类型转换。

追问延伸

  • interfacetype 有什么区别?
  • anyunknownnever 分别是什么?

Q7: Proxy 和 Reflect 的应用场景? 「🟡 中级」

考察点:元编程能力。

参考答案

  • Proxy:拦截对象操作(get/set/has/delete 等),实现响应式、数据校验、日志记录。
  • Reflect:提供与 Proxy 对应的默认行为,保证正确的语义(如 Reflect.get 会触发 getter)。
  • Vue 3 的响应式系统用 Proxy 替代 Object.defineProperty,支持数组、新增属性等场景。

追问延伸

  • Proxy 和 Object.defineProperty 的区别?
  • 怎么用 Proxy 实现数据校验?