跳到主要内容

ES6+✅

递归和尾递归是什么概念?

答案
  • 递归:函数调用自身,通常用于分解问题。每次递归会创建新的调用栈帧,若无终止条件会导致栈溢出。
  • 尾递归:递归调用是函数的最后一步,返回递归结果,无需保留当前帧。理论上可被优化为循环,避免栈溢出(JS 目前主流引擎未实现优化)。
实时编辑器
// 普通递归
function factorial (n) {
  if (n === 0) return 1
  return n * factorial(n - 1)
}

// 尾递归
function factorialTail (n, result = 1) {
  if (n === 0) return result
  return factorialTail(n - 1, n * result)
}
结果
Loading...

答案解析
尾递归可优化性能,减少栈空间消耗,但 JS 引擎实际支持有限。

面试官视角

  • 核心考察点:能否区分递归与尾递归
  • 评分标准:
    • 差:只会写递归
    • 优:能举例说明尾递归优化原理

JS 严格模式为什么禁用 with 语句?

答案

严格模式禁用 with 语句,原因有三:

  1. 性能问题:with 让作用域链不确定,阻碍 JS 引擎优化。
  2. 可读性差:with 会引入命名冲突,代码难以维护。
  3. 易出错:with 可能导致变量意外变为全局变量或覆盖局部变量,增加 bug 风险。
实时编辑器
const person = { name: 'Alice', age: 25 }
function updatePerson (person) {
  // with (person) {
  name = 'Bob' // 实际创建了全局变量 name
  // }
}
updatePerson(person)
console.log(window.name) // 'Bob'
结果
Loading...

答案解析
with 破坏作用域链和变量查找规则,易引发难以排查的 bug,严格模式下直接报错。

面试官视角

  • 核心考察点:能否说出 with 的危害
  • 评分标准:
    • 差:只会用 with
    • 优:能结合作用域和全局变量说明

stage0、stage1、stage2、stage3 分别代表什么含义?

答案
  • Stage 0:草案阶段,任何想法都可提交,未被 TC39 正式采纳。
  • Stage 1:提案阶段,有负责人和初步方案,值得进一步探讨。
  • Stage 2:草案阶段,规范文本基本完成,有实验性实现。
  • Stage 3:候选阶段,规范稳定,等待社区和实现者反馈。
  • Stage 4:完成阶段,正式纳入 ECMAScript 标准。

答案解析
理解提案流程有助于判断新特性的稳定性和可用性。

面试官视角

  • 核心考察点:能否说出各阶段含义
  • 评分标准:
    • 差:只知 ES6/ES7
    • 优:能结合实际举例

装饰器(Decorator)是什么?如何实现?

答案
  • 装饰器是一种特殊语法,用于动态修改类、方法、属性等的行为,本质是函数。
  • 常用于日志、权限、缓存、AOP 等场景。
  • 目前为 ECMAScript 提案,需 Babel 等工具支持。
实时编辑器
function timer(target, name, descriptor) {
  const original = descriptor.value
  descriptor.value = function (...args) {
    console.time(name)
    const result = original.apply(this, args)
    console.timeEnd(name)
    return result
  }
  return descriptor
}

class MyClass {
  @timer
  myMethod() {
    // do something
  }
}
结果
Loading...

答案解析
装饰器让类的扩展更灵活,便于实现横切关注点(如日志、权限)。

面试官视角

  • 核心考察点:能否说出装饰器原理和应用场景
  • 评分标准:
    • 差:只会用,不知原理
    • 优:能写简单实现并举例