字节钉钉饿了么前端面试全复盘:从事件循环到微前端实战解析

发布时间:2026/8/30 14:21:21
字节钉钉饿了么前端面试全复盘:从事件循环到微前端实战解析 金三银四那阵子我前后面了字节、钉钉、饿了么三家加上其他几家中小厂总共一个多月把前端该问的硬核问题基本都过了一遍。谈不上“收割offer”的爽文但正是这些不算圆满的经历让我对这三家面试风格的理解比单纯刷面经要深得多。这篇文章就是一次完整复盘三家公司各自的面试流程、我记得的每一道题目、我当时的答题思路以及事后验证过的正确回答方向。如果你也打算投这几家或者只是想搞清楚大厂前端面试到底在考察什么这篇文章值得花十分钟读完。我不会只列题目——只列题目那是八股文复读机我会把每道题背后的考察意图、回答的完整链路和容易踩的坑一起讲清楚这样你才知道怎么准备而不是背完就忘。1. 为什么我会同时面这三家投递策略与前期准备1.1 三家公司的业务侧重点与面试风格预判先说结论字节、钉钉、饿了么虽然是三家不同公司但它们对前端候选人能力的考察维度差异很大这个差异和各自业务形态强相关。字节这边最典型的感受是重广度、重场景。面试官会围绕一个看似基础的问题不断往下追问比如从事件循环问到浏览器渲染再到性能指标一环扣一环。字节对 React 和微前端的考察频率很高这和飞书、抖音等场景的多团队协作有直接关系。钉钉的面试则明显带着企业级应用的底色。权限管理、租户隔离、低代码、复杂表单、音视频会议这些企业协作场景的东西几乎躲不开。钉钉前端对 Vue 的掌握深度要求很高尤其 Vue3 源码层面的理解业务线里大量管理后台和低代码平台都是 Vue3 写的。饿了么给我感觉是最“学院派”的基础扎实度看得非常重。CSS 布局细节、JS 继承体系、HTTP 状态码、手写一系列原生 API这些偏工程基础的东西占了很大比重。算法和数据结构的要求也比另外两家更硬核——至少一面就出了 LeetCode 中等难度往上的算法题这在现在的环境下不算苛刻但确实有人会在这里翻车。1.2 简历和项目复盘做了什么我在投递前做的最重要的一件事不是刷题而是把简历里写的三个项目全部按“技术挑战 — 方案选型 — 落地细节 — 量化收益”重新过了一遍。这一步非常关键因为前端面试到第二轮之后几乎所有时间都在挖项目简历上的每一句话都可能被当成提问的入口。举个例子我在某个项目里写了“通过 Web Worker 实现大文件分片上传的 hash 计算”面试官直接展开问了一连串问题分片大小怎么确定hash 算法为什么选非加密的并发数怎么控制如果服务端返回“该分片已存在”怎么处理产品要求秒传的话前端还要做什么你会发现如果你只是“用过”某个技术而不是真正理解它的边界和取舍二面大概率撑不过十分钟。我自己的策略是每个项目准备好三个“可深聊”的技术点每个点都能讲清楚为什么选它不选另一个以及实际数据。比如大文件上传我对比过直接 FileReader 读全部内容和分片读的差异也测过不同分片大小2MB、5MB、10MB在弱网下的稳定性最后选 5MB 是因为服务端限流和内存占用的平衡点。这类细节面试官非常吃这一套因为能看出你真做过而不是背了篇博客。1.3 八股文和手写题怎么刷最有效“前端面试八股文”是被吐槽最多的东西但它其实是很多公司的第一道筛子。我的刷法不是背题而是把高频题分成“机制题”和“实现题”两类针对性地做理解型记忆。机制题比如事件循环、浏览器缓存、闭包、原型链重点是把流程图画在脑子里能用自己的话顺下来最好配合一个小例子。面试官会追问“为什么先微任务再宏任务”能答出是为了保证微任务之间的状态一致性比单纯背答案得分要高得多。实现题就是手写 Promise.all、防抖节流、深拷贝、数组扁平化这类我要求自己脱离 IDE、在纸上写出来并且写完能回答两个追问“这个实现有没有边界情况没考虑”“如果数据量变大会不会有性能问题”大部分候选人挂在手写题上并不是不会写而是写出来之后被追问慌了。提前自问自答一遍效果远好于刷十道重复题。2. 字节前端面试实录从事件循环到微前端的连环追问2.1 一面浏览器原理、缓存与事件循环字节的一面整体节奏非常快上来没有过多寒暄直接在某个在线代码平台上开始出题。第一道题是事件循环的输出顺序。题目大概是console.log(script start); setTimeout(() { console.log(timeout); }, 0); Promise.resolve().then(() { console.log(promise1); }).then(() { console.log(promise2); }); console.log(script end);正确答案是 script start、script end、promise1、promise2、timeout。这个本身不稀奇关键在于后面的追问“Promise.then 和 async/await 的 await 后面那行代码在微任务队列里的执行顺序有什么不同”这里考察的就是 async 函数中 await 的语义——await 会让出当前协程后面的代码被包装成一个微任务。类似这种“我以为我会了但面试官换了个马甲我差点不认识”的问题在字节一面里特别多。第二道题是浏览器缓存。面试官没有直接问强缓存和协商缓存的概念而是给了一个场景“前端发布新版本后用户打开页面还是旧资源你怎么排查怎么解决”这个问题一定要从浏览器缓存命中顺序展开先看 Cache-Control 的 max-age 是否过期再看 ETag/Last-Modified 的协商结果最后才考虑 Service Worker 缓存。前端的处理思路通常是构建时给文件名加 hashindex.html 设置 no-cache静态资源缓存一年。但很多人忽略了 index.html 本身的做法我就会强调index.html 必须走协商缓存或 no-cache否则你改了 JS 文件名也是白搭。一面还有一个我印象深刻的细节题“一个页面从输入 URL 到渲染完成中间经历了哪些步骤”这道题太常考了但字节的考察深度不在流程本身而是问“JS 脚本在 HTML 中哪个位置会影响 DOMContentLoaded 触发时间”很多人的回答止步于“放在 body 底部可以避免阻塞渲染”但更深一层的解释是带 async 的脚本不影响 DOMContentLoaded而带 defer 的脚本会等待 DOM 解析完再执行因此 DOMContentLoaded 会在 defer 脚本执行之后触发。这个细节如果你不自己写过页面监控或者看过 HTML spec很难第一时间想到。2.2 二面微前端沙箱与大文件上传场景题二面切入的是我简历里的项目但很快引到深水区。面试官问“如果让你改造现有的巨石应用为微前端你会怎么设计沙箱隔离”这个问题我印象极深因为它在各个公司面试里反复出现但字节的期望水平尤其高不仅要说出 qiankun 或 wujie 的用法更要能画出一个 Proxy 沙箱的简化实现思路解释为什么无法真正做到 JS 运行时的完全隔离。我当时的思路是从几个层面往下拆。首先说明为什么 iframe 不是首选——它不是不好而是隔离太彻底URL 不同步、会话状态不共享、通信成本高几乎等于两个独立站点的拼接对用户体验和工程一体化都不友好。然后转向 JS 沙箱快照沙箱的思路是启动时记录 window 上的所有属性卸载时还原但缺点是遍历开销大无法防御运行时新增的全局污染Proxy 沙箱更好通过 get/set 拦截让子应用的 window 读写操作落到一个代理对象上应用卸载时整个代理对象直接丢弃完成清理。这中间还可以用with配合 Proxy 来实现代码执行环境内的属性查找但我没有把实现塞给面试官而是说“这是一个可行方向具体要看团队对性能的容忍度”。大文件上传的场景题也在二面出现。面试官给了一个很实际的约束“用户的网络很不稳定上传最大 2G 文件要求支持断点续传你从前端角度怎么设计”我的回答结构是分片上传 hash 指纹 服务端去重 断点续传。分片大小选了 5MB因为服务端一次能接收的资源有限、5MB 在弱网下重试成本可控。hash 计算方面建议用 SparkMD5 放在 Web Worker 中算文件的增量 hash避免阻塞主线程。断点续传的精髓在于上传前先请求一个接口把文件 hash 发给服务端服务端返回已存在分片编号列表前端只上传缺失的分片如果所有分片都存在直接触发秒传。我向面试官补充了一个容易漏的点分片要带序号后端只能根据序号做拼接否则并发请求返回顺序不一致数据就错乱了。2.3 三面系统设计——如何实现一个 Tree 组件三面是系统设计题题目很开放“设计一个支持异步加载、搜索过滤、增删改节点的 Tree 组件说说你的组件 API 设计、状态管理方案以及性能优化点。”我的回答是按“数据流驱动渲染”的思路展开的。数据结构上先把扁平数组转成树形结构组件状态只保留展开节点集合和选中节点集合节点数据放在 props 里这样异步加载只是“往数据源里塞子节点更新展开集合”的过程。搜索过滤时用useMemo做基于关键字的前置过滤避免每次渲染都重新遍历整棵树。性能优化上重点讲虚拟化Tree 节点超过 500 个时直接渲染所有节点会让 DOM 爆掉采用按需渲染只渲染可视区节点 overscan 缓冲可以明显降低卡顿。面试官追问“虚拟化之后展开动画怎么做”我答可以只对当前展开的节点做高度过渡或者干脆用 FLIP 动画而不是依赖 CSS 的 height 过渡去计算每一个节点的动画帧。三面整体下来不是考你会不会某个框架 API而是看你面对一个完全开放的问题时能不能从数据结构、组件通信、性能演进三个维度做出合理决策。这一点字节给我的感觉是他们不是要一个“API 调用工程师”而是希望你对前端开发的全链路都有清晰的工程判断力。3. 钉钉前端面试实录源码原理与低代码场景3.1 一面Vue3响应式与KeepAlive的实现细节钉钉一面开场即为 Vue 专项。第一个问题就有代表性“Vue3 的响应式原理和 Vue2 相比到底改了什么为什么 Vue3 不用 Object.defineProperty 了”这个问题我在来的路上正好复习过所以答得比较完整。Vue2 的 Object.defineProperty 只能拦截对象的属性读写所以需要递归遍历整个对象把每个属性都变成 getter/setter深度响应式首屏初始化开销大同时新增和删除属性无法拦截只能通过Vue.set/Vue.delete补齐。Vue3 的 Proxy 是代理整个对象get 时按需懒代理子对象性能更好新增删除属性天然能拦截数组也不需要特殊处理。这些都是表面的差异面试官接下来追问了一句才是重点“Proxy 的 get 拦截里为什么要用 Reflect.get(target, key, receiver) 而不是直接 target[key]”我当时愣了一下快速回忆到这涉及 this 绑定问题——当对象有 getter 且内部访问了 this 时直接读 target[key] 可能丢失正确的 this 指向而 Reflect.get 传入的 receiver 能确保 this 正确绑定到代理对象。这一层如果没理解面试官会觉得你只是背了结论没有真正看懂源码。接着的问题是 KeepAlive 的实现原理。这里要讲清楚KeepAlive 组件本质上是一个抽象组件它通过render函数返回子组件但在内部用 Map 缓存了组件的 vnode并利用move方法在 deactivated 时把真实 DOM 放到一个隐藏容器中activated 时再移回原位置。缓存时不能忘记 key 值否则会复用错误的组件实例。我说到按需缓存时提到include/exclude是基于组件 name 做匹配时面试官点头打断我说“那你知道这个匹配是包含还是完全匹配吗”这个细节我确实没有实测过诚实回答“不完全确定需要查文档”事后查证是 include/exclude 是子字符串匹配。面试中遇到这种半懂不懂的点坦诚比硬编要有用因为面试官其实能听得出来。3.2 二面权限管理、SSE和业务落地钉钉二面的问题非常贴近企业级应用的实际场景。第一问是“一个管理后台不同角色看到不同的菜单、按钮和接口数据权限前端怎么设计”这个问题我答得相对顺畅因为项目里正好做过。我的方案分了三个层级第一层是路由权限服务端返回当前用户的权限码列表前端在路由守卫里做动态路由注册未授权的路由直接重定向到 403第二层是按钮权限写一个自定义指令v-permission指令的mounted钩子里检查权限码没有权限就移除 DOM第三层是数据权限只能由后端接口控制前端不做数据级过滤。向面试官说明时我特别强调了第一层的动态注册需要用router.addRoute而不是简单地在路由表中写死 roles 字段——因为写死的话前端打包时所有路由都进入 bundle等于把权限信息暴露给了可观察的代码安全性差一个层次。第二问是“了解 SSE 吗和 WebSocket 比什么场景下用 SSE”这是在考你对通信协议选型的判断。我的回答是SSE 是单向的、基于 HTTP 的服务器推送适合服务端实时状态主动给前端刷新的场景比如消息通知、工单状态变化、代办任务数字变化WebSocket 是双向全双工适合在线文档协同、聊天、实时游戏等需要客户端频繁上行消息的场景。SSE 的优势是自动重连、EventSource 原生支持、协议简单对服务器资源占用也更小。面试官追问“钉钉待办列表的未读数用哪个”我当时判断是 SSE 足够——读操作的实时性要求不像聊天那么高而且是单向下行SSE 明显更轻量。这里有个“业务决定技术”的感觉面试官核心想看的其实是你有没有结合场景做选择的意识。3.3 三面低代码页面渲染引擎设计与工程化钉钉三面问了一个很“钉钉”的问题“如果做一个低代码平台前端怎么设计页面渲染引擎”这道题考察的深度确实少见但也非常符合钉钉的业务形态。我的回答从物料、协议、渲染器三个核心概念展开页面 DSL 描述为一个 JSON schema包含 components 数组和每个组件的 props、events、children物料库是注册好的组件集合渲染器根据 schema 的 type 字段从物料库找到对应组件用component :is动态渲染事件处理通过一个内置的 action 列表实现比如{ action: navigate, url: /xxx }、{ action: setValue, target: form-01, value: xxx }这些 action 由渲染引擎解析而不是直接绑定 JS 函数避免把逻辑写进 JSON 导致安全问题。面试官追问“schema 版本升级了旧页面怎么兼容”我说在 schema 中加 version 字段渲染引擎对不同版本做适配层优先保证旧数据可渲染再用迁移脚本把旧 schema 更新到新版本。她又问“渲染引擎的性能怎么保障”我答了三层组件懒加载只有页面真正用到某个物料时才异步加载大列表区域虚拟化自定义指令冻结比如v-memo避免大范围响应式绑定。三面结束后我最大的感受是钉钉的面试非常看中**“你有没有真正做过复杂前端应用”**而不是“会背多少组件库 API”。如果你简历里写过管理后台、低代码、可视化的东西一定要提前把架构设计、版本兼容、权限和安全这几个维度想透。4. 饿了么前端面试实录JS基础、算法与工程细节4.1 一面ES6、手写Promise.all与布局题饿了么一面的考察范围特别“教科书”但每道题都不能掉以轻心。开始是一道手写题实现Promise.all要求支持传入可迭代对象并正确处理空数组。我在纸上写的时候重点考虑的是如何处理非 Promise 值用Promise.resolve(item)包裹可以让代码统一还要处理 reject 情况只要有一个 promise 失败就直接 reject并且不等待其他 promise 完成——这是Promise.all的语义。面试官追问“如果其中一个 promise 先 reject 了其他 promise 还在进行中它们的结果还需要处理吗”我回答不需要reject 已经确定了整个 Promise.all 的状态但正在执行中的 promise 并不会被取消它们的结果只是会被忽略。这里的关键词是“不会被取消”如果你以为 reject 会自动取消其他请求就错了实际项目中还会引发“未处理的情况”——我在答的时候额外提了一句“用 AbortController 手动取消剩余请求”面试官明显对这个补充有积极反馈。接着是一道 CSS 布局题“实现一个三栏布局左右固定 200px中间自适应要求中间部分优先渲染。”经典的双飞翼或 flex 实现。我选了 flex 方案.container { display: flex; } .left { width: 200px; order: 1; } .center { flex: 1; order: 2; } .right { width: 200px; order: 3; }但要让中间优先渲染HTML 结构上需要把 center 放在最前面再通过order调整视觉顺序。我补充了一句flex 的order只改变视觉顺序DOM 顺序还是可控的这正好符合“中间优先渲染”的需求。此外面试官还问“flex 和 grid 的适用场景区别”这种题没有标准答案我按自己的理解说flex 适合一维布局行或列grid 适合二维布局行列同时控制复杂页面用 grid 更清晰组件内局部排列用 flex 更顺手。4.2 二面HTTP/HTTPS、跨端方案与算法饿了么二面先来一道算法“给定一个二叉树返回它的层序遍历结果。”这是一个 BFS 模板题用队列实现即可。把每一层的节点数在循环开始时记下来内层循环弹出该层所有节点放入 level 数组然后把 children 推入队列。这里的关键点是“每层处理前先固定 size”而不是 while(queue.length) 一直弹否则无法区分层边界。算法结束之后进入计算机网络环节。面试官问“HTTPS 完整握手过程说一下重点是 TLS 握手。”我的回答覆盖了客户端发送 ClientHello包含支持的 TLS 版本、随机数、密码套件列表→ 服务端返回 ServerHello选定套件、服务端随机数和证书 → 客户端验证证书链 → 客户端生成预主密钥用证书公钥加密发给服务端 → 双方根据两个随机数 预主密钥生成对称会话密钥 → 之后业务数据全部用对称加密传输。面试官追问“为什么不用非对称加密直接传数据”我答非对称加密计算开销远大于对称加密TLS 只在握手阶段用非对称完成密钥交换之后用对称加密保证性能。这是 HTTPS 的基本思路但也特别容易在面试中因紧张而漏掉某个阶段。接下来是跨端方案的问题“你们团队做移动端页面H5、小程序、React Native 怎么选型”我给出的核心判断是看业务对动态化、性能和资产复用的需求。H5 动态性最强不发版直接更新、开发成本最低但性能体验受限于 WebView小程序在微信生态内体验接近原生但依赖平台审核RN 性能好、能复用 React 生态但发版成本和原生模块维护成本都不低。我还提到一个实际经验如果是做电商活动页H5 优先如果是做复杂的 IM 或者工具类页面RN 或原生更靠谱如果同时做小程序和 App可以评估 Taro 或 uni-app 这类跨端框架但要看团队对抽象层的掌控能力。这类问题的回答没有对错但面试官能通过你的选型逻辑判断你的方案决策能力。4.3 三面项目深挖与性能优化的完整链路三面约等于一次架构评审面试官会拿着我简历上的项目细抠。我写过一个面向 C 端的 H5 活动页面试官问“这个页面首屏渲染大概多少时间你怎么定位和优化的”我按性能优化的标准化流程讲了一遍。首先通过 Performance API 和 Lighthouse 拿数据——FCP 从 2.8s 降到 1.4s、LCP 从 4.2s 降到 2.1s。定位时先排除网络因素看请求时序图发现是 JS bundle 太大主包超过 1MB。优化动作分三层路由级拆包把活动页独立成懒加载 chunk、公共依赖 CDN 化React、ReactDOM 走外部链接、图片换成 WebP 懒加载。同时处理了白屏期间的占位逻辑用骨架屏而不是 loading 动画。我还提到一个细节LCP 指标最大时是页面中的一张首屏 banner 图一开始把图片压缩到 100KB 以内还把 banner 的 DOM 优先级提到文档最前配合fetchpriorityhigh让浏览器提前请求。这种层层递进的过程比直接丢结论好得多。三面还有一个有意思的问题“前端团队的构建速度从 1 分钟优化到 10 秒你会怎么做”这明显是考验工程化能力。我拆为几个方面cache-loader 或 Webpack5 持久化缓存开启CacheGroup 合理分包用 thread-loader 开启多进程构建把 babel 的babel/preset-env的 targets 收紧一点减少转换代码量再配合按需 polyfill。如果项目用的是 Vite天然依赖预构建 esbuild构建速度已经快很多重点就变成优化 Dev Server 的依赖预构建策略和配置optimizeDeps排除个别大依赖。5. 三场面试的核心复盘我踩过的坑和调整策略5.1 面试风格横向对比表面完三家之后我把它们的风格差异整理成了一张表方便自己后续复盘也供你参考维度字节钉钉饿了么技术栈倾向React 为主Vue 也接受Vue3 深度考察React/Vue 都有考察基础题目风格连环追问、场景题多源码原理 业务落地教科书级基础 算法算法要求中低少量简单题中低基本不卡算法中等到困难必考一面重点浏览器原理、事件循环、手写Vue 响应式、组件设计CSS、JS 基础、手写二面重点工程化、微前端、架构设计权限、SSE、业务场景HTTP、算法、跨端三面重点系统设计、开放题低代码设计、工程化项目深挖、性能优化总体感受反应快 背得多深度 广度扎实 技巧这张表只代表我当次面试的感受而且和面试官个人风格强相关没法完全代表对应公司但大体上可以反映出三家公司对前端工程师核心能力的预期差异。字节的追问风格最考验临场反应一个问题抛出来你答出某个关键词他会顺着关键词继续深挖三到四层直到你答不出来为止。这不是故意为难而是通过追问确认你到底理解到哪一层。钉钉比较典型的是“这个方案在真实对客场景下会遇到什么问题”问题都有明确的业务背景。饿了么则很像校招高年级题——基础、算法、系统设计全覆盖准备方式也应该更像备考。5.2 我答得最差的题和正确的回答思路整个面试过程中我印象最深的一个失败回答是字节二面被问到“微前端方案里为什么子应用最好不要跨应用直接操作全局状态”我当时只答了“会破坏隔离性”回答得太表面了。正确思路应该有两个层面技术上子应用直接改 window 上挂载的数据主应用无法感知到变化无法触发更新也就没法联动架构上跨应用共享状态如果通过 localStorage 或 window 传递本质上是隐式协议不受版本管理约束一旦主应用改了数据结构子应用很难排查。正确做法是通过注册到主应用的 API 通信或者通过 props 传递共享数据把跨应用通信变成显式接口。还有一个钉钉一面的问题“computed 和 watch 有什么区别”我一开始只答了 computed 有缓存、watch 用于副作用被追问“computed 为什么能缓存”就卡住了。其实关键在 Vue3 的 computed 内部构建了一个 reactive effect并且设置了dirty标志位依赖变化时先把 dirty 标为 true等再次访问 computed 值时真正执行 getter 重新计算。这就是为什么 computed 的 getter 在依赖没变时不会被重复执行相比 watch 的“每次变化都触发回调”有本质区别。看源码的 getter 设计是理解这个问题的钥匙我也是事后读了源码才明白这算是这次面试最大的教训之一——不要停留在 API 使用层要往实现层走一步。5.3 对准备面试的三点最终建议第一把简历上每个技术点都往下挖两层。你写“使用 Web Worker 优化性能”就一定会被问 Web Worker 的通信开销、最大线程数、worker 内部不能访问 DOM 的原因。与其在现场搜肠刮肚不如提前把简历上所有点都过一遍“为什么这样用、有什么局限、换一种方案行不行”。第二手写题不能只看答案。Promise.all 这类实现题背下代码没意义面试官一定会问边界条件和性能问题。我的建议是每个经典手写题都从实现思路讲一遍包括异常处理、空值处理、并发控制才能在面试时稳稳接住追问。这一条对字节和饿了么都极其适用。第三项目复盘时准备一份“数字清单”。你的项目性能提升了百分之多少bundle 体积降了多少接口耗时从几秒降到几秒没有真实数据支撑的架构决策在面试官眼里都是纸面设计。我见过太多候选人项目的技术方案讲得非常精彩但一问到“效果如何”就答不上来。多做埋点、多拿数据不仅面试管用对日常工作也是必要的。6. 面完之后的长期建议把面试当项目复盘来做很多人面完试就不管了其实每次面试都是一个免费的“能力体检”机会非常值得花半小时做一轮结构化复盘。我在整个流程走完后做了一份在线表格按“公司 / 轮次 / 问题 / 我的回答 / 正确的回答 / 知识点链接”逐条记录。这个动作的价值不在于面试当下而在之后两个月的准备中能反复回看你会清晰地看到自己的知识盲区集中在哪几个主题以及哪些问题是“知道但讲不清楚”的——这两类比“完全不知道”更容易弥补但只要你不复盘它们会一直在下一次面试时再次出现。给一个更具体的模板每一次面试结束后趁记忆清晰把还记得的问题全部记下来然后对每个问题打三个标签——“答得好 / 一般 / 答不出来”。过两天再重新看答不出来的题用自己的话写一遍正确答案。到了冲刺阶段只看这些红黄色标签的问题就够了不需要再从头刷一遍题库。最后分享一个心态调整的经验面试被挂一次真的不代表你技术不行面试过程中的状态、运气、表达能力都会影响结果。我第一家投字节就挂了当时的确不好受但复盘后发现自己对微前端沙箱的源码理解确实不到位。后来一周内重点补了这块在钉钉二面被问到类似问题时就能从容答个大概。面试这东西说到底就是“把不会的补上把会的讲清楚”。保持这个循环不管这次结果怎么样下一次一定比上一次强。

相关新闻