前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
  • 基础进阶

    • 基础篇
    • 进阶篇
    • 高频篇
    • 手写篇
    • 设计模式
  • 精选模块

完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

前端高频面试题-精选篇-ES6模块

# 1 ES5、ES6和ES2015有什么区别?

30 秒速记

  • ES6 就是 ES2015,同一版标准的两个叫法 —— ES6 是制定期间的代号,发布后改用年份命名
  • 日常语境里 ES6 常被泛指"2015 年之后的现代 JS",包含 async/await(ES2017)、可选链(ES2020)等
  • ES5 是 2009 年的上一代标准,两者相隔六年
  • 改成年度发布制是因为 ES6 憋了六年、一次性发布导致规模过大、浏览器实现缓慢
  • 工程上真正决定"能用什么"的不是标准版本,而是 browserslist 基线 + Babel 转译 + core-js polyfill

严格来说,ES6 就是 ES2015,而 ES5 是 2009 年发布的上一代标准。 ES6 是第六版标准在制定期间的叫法,2015 年正式发布后改用年份命名;因为这一版积累了六年、规模较大,之后转成年度发布。日常说“ES6 代码”时,常常泛指 ES2015 之后的现代 JavaScript,甚至包含 async/await 和可选链。工程里真正决定能否使用某项能力的,是 browserslist、Babel 与 core-js 配置,而不是口头上的版本名。

先分清这三个词指的是什么:

  • ES5 —— 2009 年发布的语言标准,是 ES6 之前用了六年的版本。
  • ES2015 —— 2015 年 6 月发布的那一版标准,正式名称就叫 ECMAScript 2015。
  • ES6 —— ES2015 在制定期间的代号。因为它是第 6 版,社区叫惯了 ES6,发布后名字改成按年份命名,但口语里 ES6 一直沿用下来。

所以严格说:ES6 = ES2015,是同一版标准的两个叫法。

但日常语境里 ES6 经常被泛化使用,指"ES2015 及之后的所有现代 JS"—— 比如有人说"这段代码用了 ES6",里面可能有 ES2017 的 async/await 或 ES2020 的可选链。这种用法不精确但很常见,面试时能点破这一点是加分项。

为什么 2015 年之后改成按年份命名?

ES6 制定了整整六年(ES5 是 2009 年),中间积压了大量特性一次性发布,导致规模庞大、浏览器实现缓慢。TC39 因此改成了年度发布制:每年 6 月发布一版,成熟一个特性就纳入一个,避免再出现"一版憋六年"的情况。

后续版本的代表特性:

版本 代表特性
ES2015 let/const、箭头函数、class、模板字符串、解构、Promise、Module、Map/Set、Symbol
ES2016 includes、指数运算符 **
ES2017 async/await、Object.entries、padStart
ES2018 对象展开、Promise.finally、异步迭代
ES2019 flat、Object.fromEntries、可选 catch 绑定
ES2020 可选链 ?.、空值合并 ??、BigInt、动态 import
ES2021 replaceAll、逻辑赋值 ??=、WeakRef
ES2022 类私有字段 #、at()、顶层 await
ES2023+ findLast、数组的不可变方法(toSorted/toReversed)

工程上更值得关心的是"我能用哪些":这不由标准版本决定,而由你的 browserslist 基线和构建配置决定。语法交给 Babel 转译,新 API 靠 core-js polyfill —— 所以真正要回答的是"目标浏览器支持到哪",而不是"这是 ES 几"。

面试官追问

追问 1代码评审里有人把含有 async/await 和可选链 ?. 的文件统一标成“纯 ES6”,并据此判断旧浏览器可运行;你会怎样纠正?
参考回答

我会指出 ES6 严格等同于 ES2015,而 async/await 属于 ES2017、可选链属于 ES2020,口语中的“ES6”常被泛指现代 JavaScript。兼容性不能由这个标签推导,仍要回到目标浏览器和构建配置。

追问 2营销页要覆盖项目既定的旧浏览器基线,开发者新增了箭头函数和 Object.fromEntries;构建评审时你分别检查什么?
参考回答

我会检查 Babel 是否按 browserslist 转译箭头函数等语法,并确认 core-js 是否为 Object.fromEntries 这类新 API 提供所需 polyfill。语法转译与运行时能力是两条链路,只配置其中之一仍可能在线上报错。

追问 3团队把目标环境改成较新的内置 WebView 后,负责人想立刻删除全部转译和 polyfill;你会要求哪些证据?
参考回答

我会先根据新的 browserslist 基线核对实际引擎支持,并分别审查代码使用的语法和内建 API,不能用“较新”代替兼容性证据。确认产物和运行环境一致后才能逐项移除;过早清理会把构建收益换成运行时失败风险。

追问 4线上只有一类浏览器报 Object.fromEntries is not a function,同一页面的箭头函数执行正常;你会从哪条构建链路排查?
参考回答

我会优先检查 core-js 的注入模式、目标基线和最终产物,因为箭头函数正常只能说明语法已被支持或转译,不能证明新 API 存在。再用受影响浏览器复现并查看 polyfill 是否加载;盲目调整 Babel 语法插件通常解决不了该错误。

追问 5架构师主张所有新特性都手工查 caniuse,工具负责人则要求完全依赖 browserslist;你会怎样划分职责?
参考回答

我会让 browserslist 成为项目可执行的兼容基线,由 Babel 和 core-js 据此生成产物;对关键或边缘能力再查兼容资料并做目标环境验证。提案是否进入标准还应看 TC39 阶段,只有 Stage 4 才表示已纳入标准,不能与浏览器落地程度混为一谈。

# 2 babel是什么,有什么作用?

30 秒速记

  • Babel 是源码到源码的编译器,流程是 解析成 AST → 插件转换 → 生成代码 三段式
  • ⚠️ 默认只转语法不转 API:箭头函数会转,Promise、Array.at 不会 —— 后者要靠 core-js polyfill
  • useBuiltIns 三种模式:usage(按实际用到注入,应用首选)、entry(入口全量,保险但大)、false
  • ⚠️ usage 默认不处理 node_modules,第三方库用了新 API 会漏,是"线上老手机白屏"的常见原因
  • 写库要用 transform-runtime 避免污染使用方全局;现在 SWC/esbuild 在速度上已取代它

Babel 是源码到源码的 JavaScript 编译器,作用是把新语法转换成目标环境能够运行的代码。 它会依次解析源码生成 AST、通过插件改写节点,再生成目标代码,JSX 和 TypeScript 类型擦除也依赖这套机制。要注意它默认只转换语法,Promise、Array.prototype.at 等新 API 仍需配合 core-js。应用通常用 useBuiltIns 注入补丁,库则更适合用 transform-runtime,避免污染使用方的全局环境。

Babel 是一个 JavaScript 编译器(更准确说是源码到源码的转换器),核心作用是让你能用最新的语法写代码,同时产出目标环境能跑的代码。

它的工作流程是标准的三段式:

源码 → [解析 Parse] → AST → [转换 Transform] → 新 AST → [生成 Generate] → 目标代码
@前端进阶之旅: 代码已经复制到剪贴板
  • 解析:@babel/parser 把源码变成抽象语法树
  • 转换:各个插件遍历 AST,把新语法节点改写成旧语法节点 —— 这一步是所有插件工作的地方
  • 生成:@babel/generator 把新 AST 打印回代码字符串

最关键的一条:Babel 默认只转换语法,不转换 API。

// ✅ 语法:箭头函数会被转成 function
const fn = () => {}

// ❌ API:Promise、Array.prototype.at、Object.fromEntries 不会被转
// 低版本环境依然报 undefined is not a function
[1, 2, 3].at(-1)
@前端进阶之旅: 代码已经复制到剪贴板

要补 API 得靠 core-js 提供的 polyfill,通过 @babel/preset-env 的 useBuiltIns 配置注入:

{
  presets: [['@babel/preset-env', {
    useBuiltIns: 'usage',   // 按代码里实际用到的 API 注入
    corejs: 3,
  }]]
}
@前端进阶之旅: 代码已经复制到剪贴板
配置 行为 适用
false(默认) 完全不注入 自己控制 polyfill
'entry' 入口按目标浏览器一次性引入全部所需 保险但体积大
'usage' 按文件实际用到的注入 应用项目首选

注意 usage 默认不处理 node_modules,第三方库里用了新 API 时会漏掉,这类"本地好好的、线上老手机白屏"的问题通常就出在这。

写库和写应用的配置不一样:库项目应该用 @babel/plugin-transform-runtime,它把 helper 函数和 polyfill 从全局环境改为按模块引入,避免污染使用方的全局对象。应用项目才用 useBuiltIns。

Babel 的另一半价值是插件生态:JSX 转换、TypeScript 类型擦除、装饰器、按需引入组件库(babel-plugin-import)、React Fast Refresh 都是 Babel 插件。所以它早已不只是"ES6 转 ES5"的工具,而是整个 JS 工具链的 AST 处理层。

现在的替代品:esbuild、SWC 用 Go/Rust 重写了同样的能力,速度快一个数量级,Next.js、Vite 都已经默认用它们。Babel 的优势剩下插件生态和对边缘语法的完整支持。

← 3 JS模块5 浏览器模块 →

fe
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
  • 基础进阶

    • 基础篇
    • 进阶篇
    • 高频篇
    • 手写篇
    • 设计模式
  • 精选模块