<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>一面 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E4%B8%80%E9%9D%A2/</link><description>Recent content in 一面 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 17 Oct 2025 08:26:28 +0000</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E4%B8%80%E9%9D%A2/index.xml" rel="self" type="application/rss+xml"/><item><title>百度-商业化-秋招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-80/round-129/</link><pubDate>Fri, 17 Oct 2025 08:26:28 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-80/round-129/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-80/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这场面试主要围绕前端项目的实际工程能力展开，重点考察了候选人对动态路由、权限控制和状态管理的理解与实践。
同时涉及网络请求优化、缓存机制及组件复用等中高级工程问题，体现出对项目可维护性和性能的关注。
面试还关注了候选人对 TypeScript 应用、学习方法和职业规划的思考，考察其成长潜力与技术视野。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 跨域相关&lt;/p&gt;
&lt;p&gt;本轮共 16 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-eef1fff3-2f61-40d2-b529-e89daabbf0b0"&gt;1. 如何在前端项目中实现动态路由？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/eef1fff3-2f61-40d2-b529-e89daabbf0b0"&gt;如何在前端项目中实现动态路由？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;动态路由的核心是将路由配置从静态定义转为运行时生成或挂载。常见做法包括“前端维护完整路由表后过滤”以及“后端下发路由配置”。&lt;/p&gt;
&lt;p&gt;具体实现依赖框架提供的 API（如 &lt;code&gt;addRoute&lt;/code&gt;、&lt;code&gt;useRoutes&lt;/code&gt;），同时需要兼顾权限控制、懒加载与导航组件的解耦，才能在保证安全性的同时保持可扩展性和良好的用户体验。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在前端项目中实现动态路由，本质上是根据用户权限、接口返回的数据或者运行时条件，动态地生成或加载路由配置，从而决定页面的可访问性和导航结构。&lt;/p&gt;
&lt;p&gt;以 React Router 和 Vue Router 为例，核心思路有一些共通点：
在应用启动时，会有一个静态的基础路由表，用来保证最基本的页面可以正常访问（例如登录页、404 页、Layout 容器等）。而真正需要按用户角色、接口数据控制的路由，则通过接口请求或预置配置动态挂载进路由系统。&lt;/p&gt;
&lt;p&gt;常见的实现方式有两类：&lt;/p&gt;
&lt;p&gt;一种是前端自行维护完整的路由表，用户登录后，后端返回权限信息（角色、菜单、可访问模块 ID 等），前端在已有的路由表中做过滤，只保留当前用户有权限的部分，再动态挂载到路由系统。这种方式对前端掌控力更强，体验流畅，但需要在前端同步维护一份路由和权限的映射关系。&lt;/p&gt;
&lt;p&gt;另一种是由后端直接下发路由配置（通常带有 path、component 标识、子路由结构等），前端拿到配置后再通过组件映射表动态生成路由。这种方式能减轻前端维护压力，但会带来接口设计和前后端耦合的问题。&lt;/p&gt;
&lt;p&gt;在技术层面，React Router v6 提供了 &lt;code&gt;useRoutes&lt;/code&gt; 可以直接基于对象动态生成路由，Vue Router 也支持 &lt;code&gt;router.addRoute&lt;/code&gt; 在运行时动态添加路由。对于懒加载组件，还需要结合 &lt;code&gt;import()&lt;/code&gt; 或 &lt;code&gt;defineAsyncComponent&lt;/code&gt;（Vue）来实现，避免一次性加载所有页面。&lt;/p&gt;
&lt;p&gt;此外，动态路由不仅仅是技术实现，还涉及安全性和用户体验。例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在前端动态路由实现时，不能只依赖前端的路由控制，还需要后端接口做权限校验，避免用户绕过前端访问受限页面。&lt;/li&gt;
&lt;li&gt;路由结构最好和菜单、面包屑等导航组件解耦，通过统一的数据结构管理，保证后续扩展的灵活性。&lt;/li&gt;
&lt;li&gt;在大规模项目中，动态路由还常与微前端、模块化加载结合，按需挂载子应用或子模块。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-fb3f4b9d-6d6c-4b51-8c8d-105a621b420b"&gt;2. Vue3的addRoute与React Router的动态useRoutes有何区别？如何解决动态路由刷新后失效的问题？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/fb3f4b9d-6d6c-4b51-8c8d-105a621b420b"&gt;Vue3的addRoute与React Router的动态useRoutes有何区别？如何解决动态路由刷新后失效的问题？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Vue3 的 &lt;code&gt;addRoute&lt;/code&gt; 属于“增量挂载”，可以在运行时动态向现有路由表中追加新配置；React Router 的 &lt;code&gt;useRoutes&lt;/code&gt; 则是基于配置对象动态生成，强调整体渲染而不是单点挂载。动态路由刷新后失效的根本原因是路由配置只存在于内存中，需要在应用初始化时通过本地存储或接口请求恢复路由数据，才能保证页面刷新后仍能正确访问。&lt;/p&gt;</description></item><item><title>腾讯-3年社招-前端面试 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-79/round-127/</link><pubDate>Sun, 07 Sep 2025 02:45:19 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-79/round-127/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-79/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-79/round-128/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这些题目全面考察了前端工程师在实际项目中需要掌握的核心技术和解决问题的能力，涵盖了从基础原理到工程实践的各个层面。&lt;/p&gt;
&lt;p&gt;本轮共 23 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-327b17e537b3"&gt;1. 自我介绍、项目介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;技术栈熟练度、架构经验、性能优化成果、团队协作能力&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;具有3年前端开发经验，专注于现代化前端技术栈和工程化实践。主要负责过大型电商平台的前端架构设计和性能优化工作，熟练掌握 Vue/React 生态系统。在项目中主导了从传统架构向微前端架构的迁移，通过模块联邦和组件库建设提升了团队开发效率。同时在性能优化方面有丰富实践，将核心页面的首屏加载时间优化至2秒以内。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-264a86fa57fa"&gt;2. 可视化搭建平台中，如何设计数据规范保证组件间数据兼容性？请求收效的具体实现方案是什么？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Schema规范、数据校验、适配器模式、请求优化策略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;建立统一的数据协议规范，定义标准的组件 Schema 结构，包含 props、events、slots 等接口描述。通过 JSON Schema 进行数据校验，确保组件间数据传递的类型安全。实现数据适配器模式，当组件接口不兼容时自动进行数据转换。请求收效方面，采用请求去重和缓存策略，相同请求在短时间内只发送一次，同时建立请求优先级队列，确保关键数据的及时响应。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-7fdf24ca2fb8"&gt;3. 组件的拖拽行为如何实现？如何为组件动态注入行为（如拖拽、缩放）？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;事件序列处理、状态管理、装饰器模式、行为解耦&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;拖拽实现基于原生 Drag API 或鼠标事件，通过监听 mousedown、mousemove、mouseup 事件序列。建立拖拽状态管理，记录拖拽起始位置、当前位置和目标位置。动态行为注入采用装饰器模式或高阶组件，将行为逻辑与组件本身解耦。通过 mixin 或 composition API 的方式，在运行时为组件添加拖拽、缩放等交互能力。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-4da1a84bbb8d"&gt;4. 如何解决拖拽过程中频繁触发事件导致的性能问题？&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;节流防抖、requestAnimationFrame、事件委托、计算优化&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;使用节流（throttle）限制事件触发频率，通常设置为 16ms 以保持 60fps 的流畅度。采用 requestAnimationFrame 优化动画渲染，确保在浏览器重绘时机执行位置更新。实现事件委托减少事件监听器数量，在容器元素上统一处理拖拽事件。对于复杂计算，使用防抖（debounce）延迟执行，避免在拖拽过程中进行不必要的重计算。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-26e22fa9-becc-4552-b79a-da2f67451455"&gt;5. 性能优化关注的指标有哪些（如FCP、TTI）？你用了哪些具体手段？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/26e22fa9-becc-4552-b79a-da2f67451455"&gt;前端性能优化指标有哪些？怎么进行性能检测？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;前端性能评估主要围绕三个维度展开：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;页面加载速度、交互响应能力以及页面稳定性。常见指标包括 FP、FCP、LCP 等加载指标，FID 和 INP 等交互指标，以及 CLS 布局稳定性指标。&lt;/li&gt;
&lt;li&gt;性能检测通常分为两类方式：开发阶段使用 Lighthouse、Chrome DevTools、WebPageTest 等工具进行实验室分析；&lt;/li&gt;
&lt;li&gt;线上环境通过 Performance API 或 web-vitals 采集真实用户性能数据，并结合监控平台进行统计与优化。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;前端性能通常不会只看单一指标，而是从&lt;strong&gt;用户感知加载速度、交互响应速度以及页面稳定性&lt;/strong&gt;三个维度进行评估。当前行业中比较主流的一套指标体系来自 Google 提出的 &lt;strong&gt;Web Vitals&lt;/strong&gt;，并结合传统的加载性能指标共同评估。&lt;/p&gt;</description></item><item><title>腾讯-2年社招-前端面试 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-78/round-125/</link><pubDate>Sun, 07 Sep 2025 02:17:29 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-78/round-125/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-78/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-78/round-126/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 23 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-d92deba5d64c"&gt;1. Vue 3.0 相比 Vue 2.0 有哪些改进？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;响应式系统升级、Composition API、性能优化、TypeScript支持、Fragment支持&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Vue 3.0 在架构层面进行了重大重构，采用了基于 Proxy 的响应式系统替代了 Object.defineProperty，这使得可以直接监听数组变化和动态属性添加。组合式 API 的引入提供了更好的逻辑复用和类型推导能力。在性能方面，通过 Tree-shaking 支持、更小的包体积、以及编译时优化显著提升了运行效率。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-0fc6cee72f3d"&gt;2. Composition API 解决了 Options API 的哪些问题？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;逻辑聚合、代码复用、类型推导、避免mixin问题&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Options API 在处理复杂组件时会出现逻辑分散的问题，相关的数据、方法、计算属性被强制分离到不同的选项中。Composition API 通过 setup 函数将相关逻辑聚合在一起，提高了代码的可维护性。同时解决了 mixin 命名冲突和来源不清晰的问题，提供了更好的 TypeScript 类型推导支持。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-3c46deb606e6"&gt;3. Proxy 相比 Object.defineProperty 在响应式上有何优势？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;对象级别监听、动态属性支持、数组监听、更多拦截操作&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Proxy 可以直接监听整个对象而不需要遍历每个属性，支持动态属性的添加和删除监听。对于数组操作，Proxy 可以直接监听数组的变化，而 Object.defineProperty 需要重写数组方法。Proxy 还支持更多的拦截操作，如 has、deleteProperty 等，提供了更完整的响应式能力。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8d6eee18b772"&gt;4. nextTick 如何保证 DOM 更新后执行回调？&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;事件循环、微任务队列、异步更新、降级策略&lt;/p&gt;</description></item><item><title>腾讯-1年社招-前端面试 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-77/round-123/</link><pubDate>Thu, 04 Sep 2025 14:50:27 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-77/round-123/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-77/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-77/round-124/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 15 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-c3858e222cfb"&gt;1. 讲一下项目的难点和亮点&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;突出解决问题的能力，说明遇到过的复杂问题和优化方案，亮点要体现价值和可扩展性。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在大型前端项目中，常见难点在于性能优化和复杂业务的抽象。比如数据量大时页面渲染和交互卡顿，需要通过虚拟列表、懒加载、分片渲染等方式解决；跨端适配和复杂状态管理也是典型难点。亮点可以体现在工程化和架构设计上，例如通过模块化拆分、微前端架构提高可维护性，或通过自动化工具链提升研发效率。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-b8b956cfe46c"&gt;2. 项目的规范是如何制定的，如何执行的&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;强调自动化工具与制度双管齐下，执行靠工具、评审和 CI 流程。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;前端规范一般从编码规范、组件封装规范、目录结构、Git 提交规范等方面制定。执行时可以依赖工具保障，比如 ESLint + Prettier 自动化格式化，Husky + lint-staged 在提交时校验，CI/CD 流程中增加检测。对组件层面，约定统一的 API 风格和文档，保证多人协作一致性。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-7d27dc57-5d95-4e3f-88a7-eb685b7c21e4"&gt;3. 说说vue中的diff算法&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/7d27dc57-5d95-4e3f-88a7-eb685b7c21e4"&gt;说说vue中的diff算法&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;diff&lt;/code&gt;算法是一种高效的比较算法，主要用于比较虚拟&lt;code&gt;DOM&lt;/code&gt;节点，以确定如何更新真实&lt;code&gt;DOM&lt;/code&gt;。它具有两个特点：只会在同层级进行比较，不会跨层级比较；在比较的过程中，循环从两边向中间收拢。&lt;/p&gt;
&lt;p&gt;在Vue中，&lt;code&gt;diff&lt;/code&gt;算法用于比较新旧&lt;code&gt;VNode&lt;/code&gt;节点，以决定如何更新真实&lt;code&gt;DOM&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这个过程分为以下几个步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;比较新旧&lt;code&gt;VNode&lt;/code&gt;节点&lt;/strong&gt;：如果新旧节点相同，则不做任何操作；如果新旧节点都不存在子节点，则直接结束比较；如果新旧节点都有子节点，则进入&lt;code&gt;updateChildren&lt;/code&gt;函数比较子节点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新子节点&lt;/strong&gt;：在&lt;code&gt;updateChildren&lt;/code&gt;函数中，设置新旧&lt;code&gt;VNode&lt;/code&gt;的头尾指针，然后从两边向中间比较。如果新旧头尾指针相同，则直接&lt;code&gt;patchVnode&lt;/code&gt;；如果新旧头尾指针不同，则根据情况调用&lt;code&gt;patchVnode&lt;/code&gt;、&lt;code&gt;createElm&lt;/code&gt;创建新节点，或者从哈希表寻找&lt;code&gt;key&lt;/code&gt;一致的旧&lt;code&gt;VNode&lt;/code&gt;节点再进行分情况操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;patchVnode&lt;/code&gt;方法&lt;/strong&gt;：如果新旧节点都有文本节点且不相等，则设置真实&lt;code&gt;dom&lt;/code&gt;的文本节点为新节点的文本节点；如果旧节点有子节点而新节点没有，则删除旧节点的子节点；如果旧节点没有子节点而新节点有，则将新节点的子节点真实化后添加到旧节点；如果两者都有子节点，则进入&lt;code&gt;updateChildren&lt;/code&gt;函数比较子节点。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过&lt;code&gt;diff&lt;/code&gt;算法，Vue能够高效地比较新旧&lt;code&gt;VNode&lt;/code&gt;节点，以决定如何更新真实&lt;code&gt;DOM&lt;/code&gt;，从而提高页面渲染的性能。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一是什么"&gt;一、是什么&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;diff&lt;/code&gt; 算法是一种通过同层的树节点进行比较的高效算法&lt;/p&gt;
&lt;p&gt;其有两个特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;比较只会在同层级进行, 不会跨层级比较&lt;/li&gt;
&lt;li&gt;在diff比较的过程中，循环从两边向中间比较&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;diff&lt;/code&gt; 算法的在很多场景下都有应用，在 &lt;code&gt;vue&lt;/code&gt; 中，作用于虚拟 &lt;code&gt;dom&lt;/code&gt; 渲染成真实 &lt;code&gt;dom&lt;/code&gt; 的新旧 &lt;code&gt;VNode&lt;/code&gt; 节点比较&lt;/p&gt;
&lt;h2 id="二比较方式"&gt;二、比较方式&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;diff&lt;/code&gt;整体策略为：深度优先，同层比较&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;比较只会在同层级进行, 不会跨层级比较&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://static.ecool.fun//article/6366ea3c-b5f9-4add-a1d9-8fb1e7b6c726.png"&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;比较的过程中，循环从两边向中间收拢&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://static.ecool.fun//article/66a1b47c-6fd5-4a1a-80a9-a7bbfdf30022.png"&gt;&lt;/p&gt;</description></item><item><title>字节-技术中台-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-76/round-121/</link><pubDate>Tue, 02 Sep 2025 07:35:12 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-76/round-121/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-76/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-76/round-122/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的前端基础知识、框架理解（Vue和React）、TypeScript应用、手写代码能力以及解决实际问题的能力。面试官重点关注以下几个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;前端框架深度理解与实践&lt;/strong&gt;：不仅要求掌握Vue和React的基础知识，更强调对框架设计原理（如Vue的响应式、虚拟DOM）的理解，以及在实际项目中的应用能力（如Vuex到Pinia的迁移，以及在React中模拟Vue特性的思路）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript 核心与异步编程&lt;/strong&gt;：对&lt;code&gt;Object.defineProperty&lt;/code&gt;的数据劫持原理、Promise的深入理解及其各种组合与错误处理方式（&lt;code&gt;Promise.all&lt;/code&gt;、&lt;code&gt;Promise.allSettled&lt;/code&gt;），以及&lt;code&gt;async/await&lt;/code&gt;与Promise的关系是考察重点。手写算法题（数组扁平化、深拷贝）考验基础编码功底。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript 实际应用&lt;/strong&gt;：考察对TypeScript的熟练程度，包括基本类型、高级类型（如索引签名定义动态属性）的运用，以及如何在项目中利用TypeScript提升代码质量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工程化与性能优化&lt;/strong&gt;：Monorepo 多包依赖管理及冲突解决是工程实践的体现。图片懒加载的实现方式（尤其是&lt;code&gt;Intersection Observer API&lt;/code&gt;的应用）及其阈值优化，体现了对前端性能优化的关注和实践经验。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;整体而言，面试不仅考察&amp;quot;是什么&amp;quot;，更侧重&amp;quot;为什么&amp;quot;和&amp;quot;如何做&amp;quot;，需要候选人能够结合实际项目经验进行深入分析和解答。&lt;/p&gt;
&lt;p&gt;本轮共 20 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-8d95efee0278"&gt;1. 你刚才提到了一些项目经历，讲一个你觉的最有成就感的？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;这道题是典型的主观题，面试官并不期待一个&amp;quot;唯一标准答案&amp;quot;。&lt;/li&gt;
&lt;li&gt;主要考察的是答题者的表达能力、系统性思考问题的方式、对项目及技术的理解深度以及从项目中复盘和学习的能力。&lt;/li&gt;
&lt;li&gt;答题结构建议：简述项目背景与挑战 → 描述你的解决方案及遇到的困难 → 总结项目成果与个人成长。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在过去的项目经历中，让我最有成就感的是负责公司内部一个复杂的用户权限管理系统重构。这个系统当时面临着用户反馈权限配置混乱、性能瓶颈突出、以及新功能迭代困难等问题。&lt;/p&gt;
&lt;p&gt;当时的核心挑战在于，我们有上百种细粒度的权限点，并且需要支持多维度、动态的权限组合，这在旧系统中已经形成了一个巨大的权限矩阵，任何改动都牵一发而动全身。我首先主导了权限模型的梳理和抽象，将权限点进行了归类和分级，并引入了基于角色的访问控制（RBAC）模型，同时考虑了自定义策略的扩展性。技术选型上，我们从传统的后端硬编码权限逻辑，逐步迁移到了前后端分离、统一鉴权服务的方式，并通过引入缓存机制优化了权限查询性能。&lt;/p&gt;
&lt;p&gt;在实现过程中，最大的难点是如何在不影响现有业务的前提下，平滑地进行新旧权限系统的切换。为此，我设计了一套灰度发布方案，通过用户白名单和功能开关，逐步验证新系统的稳定性和准确性。在这个过程中，我们也遇到了一些意想不到的数据同步和兼容性问题，例如在特定场景下，新旧权限解析不一致导致的用户访问异常。我积极与后端团队、产品经理沟通，快速定位问题，并及时调整了数据同步策略和回滚机制，确保了业务的连续性。&lt;/p&gt;
&lt;p&gt;最终，重构后的权限系统不仅将权限配置的效率提升了30%，还将核心鉴权接口的响应时间从原来的数百毫秒优化到了几十毫秒，极大地提升了系统的性能和稳定性。更重要的是，它为后续的新业务快速上线提供了坚实的基础，权限迭代周期缩短了50%以上。通过这个项目，我不仅深化了对权限系统设计的理解，也锻炼了我在复杂项目中进行技术选型、架构设计、风险管理和跨团队协作的能力。这次经历让我深切体会到，解决核心痛点并为业务带来实际价值，才是技术工作的最大成就感。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-d3991a27b3f9"&gt;2. 项目里 Monorepo 管理多包依赖怎么实现的；&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Monorepo 概念：理解 Monorepo 的基本思想和优势。&lt;/li&gt;
&lt;li&gt;多包依赖管理工具：了解 Lerna、Yarn Workspaces 或 pnpm Workspaces 等工具。&lt;/li&gt;
&lt;li&gt;实现方式：掌握如何配置和使用这些工具来管理多包依赖，包括安装、发布、运行脚本等。&lt;/li&gt;
&lt;li&gt;软链接/硬链接：理解这些工具如何通过符号链接解决依赖共享和版本管理问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;Monorepo 是一种代码仓库管理策略，它将多个项目的代码存储在同一个版本控制仓库中，而不是为每个项目创建独立的仓库。这种方式的出现是为了解决多项目开发中代码共享、依赖管理、版本控制和协作效率等问题。它与传统的 Multirepo（多仓库）模式相对。&lt;/p&gt;
&lt;p&gt;其核心原理在于通过特定的工具（如 Lerna、Yarn Workspaces 或 pnpm Workspaces）来管理仓库内的多个子包（package），实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;统一的依赖管理&lt;/strong&gt;：所有包的依赖都集中在一个地方（通常是根目录的 &lt;code&gt;package.json&lt;/code&gt; 或各自的 &lt;code&gt;package.json&lt;/code&gt; 结合工具配置），避免了重复安装和版本不一致的问题。工具会通过软链接或硬链接的方式将依赖安装到各个子包的 &lt;code&gt;node_modules&lt;/code&gt; 中，实现依赖的共享和复用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统一的构建、测试、发布流程&lt;/strong&gt;：可以配置统一的脚本来执行所有或部分包的构建、测试和发布流程，简化 CI/CD。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码共享与重用&lt;/strong&gt;：各个子包可以直接相互引用，无需发布到 npm 等外部仓库，方便代码共享和模块化开发。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="12-核心用法--示例代码"&gt;1.2 核心用法 + 示例代码&lt;/h5&gt;
&lt;p&gt;以 Yarn Workspaces 为例，它作为 Yarn 包管理器的内置功能，提供了一种轻量级的 Monorepo 解决方案。&lt;/p&gt;</description></item><item><title>字节跳动-商业化-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-75/round-119/</link><pubDate>Tue, 02 Sep 2025 07:31:02 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-75/round-119/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-75/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-75/round-120/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础知识、React框架原理、算法能力等多个维度的内容。重点关注CSS布局、页面性能优化、React核心概念等方面。&lt;/p&gt;
&lt;p&gt;本轮共 18 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-96560c8c639c"&gt;1. 如何实现一个宽高自适应的正方形元素？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CSS布局技巧和响应式设计能力&lt;/li&gt;
&lt;li&gt;百分比单位在CSS中的特殊性质理解&lt;/li&gt;
&lt;li&gt;现代CSS新特性的应用能力&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;实现宽高自适应的正方形元素的核心在于确保元素的高度能够根据其宽度以1:1的比例进行等比缩放。这通常通过利用CSS中某些属性的特殊计算方式来实现，或者通过现代CSS特性直接声明。以下是几种常见方案的核心原理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;使用padding-top/padding-bottom百分比&lt;/strong&gt;：在CSS盒模型中，&lt;code&gt;padding&lt;/code&gt;属性的百分比值是相对于父元素的&lt;strong&gt;宽度&lt;/strong&gt;来计算的，即使是&lt;code&gt;padding-top&lt;/code&gt;和&lt;code&gt;padding-bottom&lt;/code&gt;也是如此。因此，当我们将一个元素的&lt;code&gt;height&lt;/code&gt;设为0，并将&lt;code&gt;padding-top&lt;/code&gt;或&lt;code&gt;padding-bottom&lt;/code&gt;设为&lt;code&gt;100%&lt;/code&gt;时，它的高度实际上会等于其父元素的宽度，从而形成一个完美的正方形（假设其宽度也为100%）。这种方法利用了这一特性来&amp;quot;撑开&amp;quot;元素的高度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用aspect-ratio（现代浏览器支持）&lt;/strong&gt;：&lt;code&gt;aspect-ratio&lt;/code&gt;是CSS的一个新属性，它允许开发者直接指定一个元素的宽高比，浏览器会根据这个比率自动计算元素的尺寸。例如，&lt;code&gt;aspect-ratio: 1/1&lt;/code&gt;会强制元素保持1:1的正方形比例。这是一个更语义化、更现代的解决方案，减少了传统方法的 hackiness。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用vw单位&lt;/strong&gt;：&lt;code&gt;vw&lt;/code&gt;（viewport width）是一个相对单位，&lt;code&gt;1vw&lt;/code&gt;等于视口宽度的1%。通过将元素的&lt;code&gt;width&lt;/code&gt;和&lt;code&gt;height&lt;/code&gt;都设置为相同的&lt;code&gt;vw&lt;/code&gt;值，例如&lt;code&gt;50vw&lt;/code&gt;，可以确保它们始终保持相等的尺寸，并随着视口宽度的变化而自适应缩放，从而形成正方形。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些方案各有优缺点，如兼容性、代码语义性等，选择哪种方案取决于具体的项目需求和目标浏览器环境。&lt;/p&gt;
&lt;h5 id="12-核心用法--示例代码"&gt;1.2 核心用法 + 示例代码&lt;/h5&gt;
&lt;p&gt;在实际开发中，这些方案可以根据兼容性需求和代码简洁性进行选择。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案1：使用padding-top/padding-bottom百分比&lt;/strong&gt;
这种方法兼容性好，几乎所有浏览器都支持。常用于需要兼容旧版浏览器或在图片、视频容器中保持比例的场景。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 宽度可以设置为百分比、固定值或vw等 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding-top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* padding百分比相对于父元素宽度计算，确保高度与宽度相等 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#eee&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* 内部内容可以通过绝对定位放置，以避免被padding挤压 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;relative&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;square-content&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;absolute&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;justify-content&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;align-items&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#333&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HTML结构示例:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;square&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;square-content&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 自适应正方形
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方案2：使用aspect-ratio（现代浏览器支持）&lt;/strong&gt;
这是CSS3新增的属性，语义化最好，代码最简洁。适用于现代浏览器环境，是推荐的首选方案。&lt;/p&gt;</description></item><item><title>字节-国际电商-前端面试 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-74/round-118/</link><pubDate>Tue, 02 Sep 2025 07:09:39 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-74/round-118/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-74/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 考察面试者的表达能力、总结归纳能力和个人亮点。&lt;/p&gt;
&lt;p&gt;本轮共 17 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-12b75c445924"&gt;1. 自我介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主观型问题，无唯一标准答案。&lt;/strong&gt; 面试官主要考察答题者的表达能力、总结归纳能力、沟通技巧以及对自身经历和技术栈的清晰认知。&lt;/li&gt;
&lt;li&gt;答题时建议围绕&amp;quot;我是谁&amp;quot;、&amp;ldquo;我做了什么&amp;rdquo;、&amp;ldquo;我做得怎么样&amp;quot;和&amp;quot;我为什么选择贵公司&amp;quot;这几个核心点展开，突出个人亮点与岗位匹配度。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;各位面试官好，我叫[您的姓名]，毕业于[您的学校]，专业是[您的专业]。在校期间，我专注于前端开发方向的学习与实践。在技术栈方面，我熟练掌握 HTML、CSS、JavaScript 基础，并深入学习了 Vue.js 框架，对 Vue 生态系统，如 Vuex、Vue Router 也有实际应用经验。在实习期间，我主要负责[您的项目职责，例如：公司官网前端页面的开发与维护，参与了XX功能模块的重构]。具体工作中，我曾独立负责[具体某个功能或模块]，通过[具体技术或方法]，实现了[具体效果或优化]，比如在[某项目中]实现了[某个功能]，有效提升了用户体验[或业务效率]。我个人对前端技术充满热情，具备良好的学习能力和解决问题的能力，期待能将我的技能和经验应用到贵公司，与团队一同成长。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-cd610cb03548"&gt;2. 在学校期间有没有参与过什么技术社团或项目，对你的前端学习有什么帮助？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主观型问题，无唯一标准答案。&lt;/strong&gt; 面试官主要考察答题者在校期间对技术的热情、主动学习能力、团队协作能力以及将理论知识应用于实践的能力。他们希望了解你如何将课外活动与前端学习结合，并从中获得了哪些成长。&lt;/li&gt;
&lt;li&gt;答题时建议突出你在社团/项目中承担的角色、遇到的挑战、如何解决问题、学到的技术知识以及对个人成长的影响。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在校期间，我积极参与了学校的[例如：创新创业协会或某个技术兴趣小组]。在这些活动中，我曾参与一个[例如：校园兼职平台]的小型项目开发。当时，我们团队面临的挑战是[例如：如何利用有限的资源快速搭建一个具备基本交互功能的前端原型]。我主动承担了前端页面的开发工作，通过自学 Vue.js 的组件化思想和路由管理，将页面拆分为可复用的组件，并实现了前端路由功能。虽然项目规模不大，但它让我第一次有机会将课堂上学习的 HTML、CSS、JavaScript 知识体系化地应用到实际开发中。通过这次经历，我不仅锻炼了独立解决问题的能力，还体会到了团队协作的重要性，比如在开发中与后端同学进行接口联调、与设计师沟通 UI 实现细节等，这对我后续的实习和前端学习都产生了积极的推动作用。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-3cf5356e8d84"&gt;3. 说说你实习项目中遇到的技术难点，以及你是如何解决的？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主观型问题，无唯一标准答案。&lt;/strong&gt; 面试官主要考察答题者对项目实践的深入理解、问题解决能力、技术深度以及学习和复盘能力。他们希望了解你在面对挑战时，如何分析问题、寻找解决方案并最终达成目标。&lt;/li&gt;
&lt;li&gt;答题时建议围绕&amp;quot;遇到什么难点&amp;rdquo;、&amp;ldquo;如何分析与定位问题&amp;rdquo;、&amp;ldquo;采用了哪些技术方案&amp;rdquo;、&amp;ldquo;解决了什么问题&amp;quot;以及&amp;quot;从中获得了哪些经验和教训&amp;quot;等核心点展开，强调思考过程和技术细节。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在我的实习项目中，我曾遇到一个比较棘手的性能问题。我们负责的一个电商列表页面，随着商品数量的增多，首次加载时间变得非常慢，用户体验受到严重影响。通过浏览器开发者工具分析，我发现主要瓶颈在于大量图片资源的加载以及首屏渲染时数据量过大导致的卡顿。&lt;/p&gt;
&lt;p&gt;为了解决这个问题，我首先考虑了&lt;strong&gt;图片懒加载&lt;/strong&gt;。我引入了一个 &lt;code&gt;Intersection Observer API&lt;/code&gt; 的实现，使得图片只有在进入用户视口时才开始加载，这显著减少了初始的 HTTP 请求数量和带宽消耗。其次，针对数据量大的问题，我调研并实现了&lt;strong&gt;虚拟列表&lt;/strong&gt;。核心思路是只渲染当前可见区域的列表项，并动态计算滚动时的偏移量和渲染范围。这避免了一次性渲染数千个 DOM 节点造成的性能压力。具体实现中，我维护了一个可滚动区域，根据滚动位置动态更新展示的数据索引，并结合 &lt;code&gt;requestAnimationFrame&lt;/code&gt; 确保滚动动画的流畅性。&lt;/p&gt;
&lt;p&gt;经过这些优化措施，页面的首次加载时间从原来的 8 秒降低到了 2 秒以内，列表滚动时的卡顿现象也基本消除。这个过程让我对前端性能优化有了更深层次的理解，特别是如何结合浏览器 API 和数据结构优化来解决实际问题，也锻炼了我分析和解决复杂性能瓶颈的能力。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-d61a01743b6a"&gt;4. 解释一下 TS 泛型的概念和作用&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;泛型概念&lt;/strong&gt;：面试官想确认面试者对泛型的基本定义、作用和设计目的的理解。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;泛型作用&lt;/strong&gt;：考察泛型在增强代码灵活性、类型安全和重用性方面的具体应用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实际应用&lt;/strong&gt;：理解泛型在实际开发中如何应用于函数、接口、类等场景，以及其在大型项目中的价值。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;1.1 原理说明&lt;/p&gt;</description></item><item><title>百度-小程序-暑期实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-73/round-117/</link><pubDate>Thu, 21 Aug 2025 15:43:17 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-73/round-117/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-73/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-a5330a58-5be0-4f4f-8394-43392311ddaa"&gt;1. 深拷贝浅拷贝有什么区别？怎么实现深拷贝？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/a5330a58-5be0-4f4f-8394-43392311ddaa"&gt;深拷贝浅拷贝有什么区别？怎么实现深拷贝？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;JS数据类型分别基本数据类型和引用数据类型，基本数据类型保存的是值，引用类型保存的是引用地址(this指针)。&lt;/p&gt;
&lt;p&gt;浅拷贝共用一个引用地址，深拷贝会创建新的内存地址。&lt;/p&gt;
&lt;h4 id="浅拷贝方法"&gt;浅拷贝方法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;直接对象复制&lt;/li&gt;
&lt;li&gt;Object.assign&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="深拷贝"&gt;深拷贝&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JSON.stringify转为字符串再JSON.parse&lt;/li&gt;
&lt;li&gt;深度递归遍历&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一数据类型存储"&gt;一、数据类型存储&lt;/h2&gt;
&lt;p&gt;前面文章我们讲到，&lt;code&gt;JavaScript&lt;/code&gt;中存在两大数据类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基本类型&lt;/li&gt;
&lt;li&gt;引用类型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基本类型数据保存在在栈内存中&lt;/p&gt;
&lt;p&gt;引用类型数据保存在堆内存中，引用数据类型的变量是一个指向堆内存中实际对象的引用，存在栈中&lt;/p&gt;
&lt;h2 id="二浅拷贝"&gt;二、浅拷贝&lt;/h2&gt;
&lt;p&gt;浅拷贝，指的是创建新的数据，这个数据有着原始数据属性值的一份精确拷贝&lt;/p&gt;
&lt;p&gt;如果属性是基本类型，拷贝的就是基本类型的值。如果属性是引用类型，拷贝的就是内存地址&lt;/p&gt;
&lt;p&gt;即浅拷贝是拷贝一层，深层次的引用类型则共享内存地址&lt;/p&gt;
&lt;p&gt;下面简单实现一个浅拷贝&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;shallowClone&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;hasOwnProperty&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;)){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在&lt;code&gt;JavaScript&lt;/code&gt;中，存在浅拷贝的现象有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Object.assign&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Array.prototype.slice()&lt;/code&gt;, &lt;code&gt;Array.prototype.concat()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用拓展运算符实现的复制&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="objectassign"&gt;Object.assign&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;age&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nature&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;smart&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;good&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name1&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;fx&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name2&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;xka&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;love&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;fx is a great girl&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Object.&lt;span style="color:#a6e22e"&gt;assign&lt;/span&gt;({}, &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="slice"&gt;slice()&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;One&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Two&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Three&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;slice&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;love&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;Two&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;love&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="concat"&gt;concat()&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;One&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Two&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Three&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;concat&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;love&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;Two&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;love&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="拓展运算符"&gt;拓展运算符&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;One&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Two&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Three&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [...&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;love&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;Two&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;love&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="三深拷贝"&gt;三、深拷贝&lt;/h2&gt;
&lt;p&gt;深拷贝开辟一个新的栈，两个对象的属性完全相同，但是对应两个不同的地址，修改一个对象的属性，不会改变另一个对象的属性&lt;/p&gt;</description></item><item><title>百度-用户增长-秋招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-72/round-116/</link><pubDate>Thu, 21 Aug 2025 15:39:11 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-72/round-116/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-72/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 20 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-7266893b44e3"&gt;1. 有没有使用 Node.js 进行开发的经历？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;“不仅仅用过 Node.js，而且能说清楚在前端团队里它解决了哪些实际问题，产生了什么价值。”&lt;/strong&gt;
这样比单纯回答“用过/没用过”更有亮点。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;考察的核心是：&lt;strong&gt;对 Node.js 的理解深度&lt;/strong&gt;和&lt;strong&gt;在前端/全栈中的实际应用场景&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;回答时可以从以下几个角度展开：&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="1-使用场景"&gt;1. 使用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;前端工程化工具链&lt;/strong&gt;：
使用 Node.js 驱动构建工具（Webpack、Vite、Rollup 等），编写脚本实现自动化构建、代码检查、Mock Server 搭建。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务端接口开发&lt;/strong&gt;：
基于 Express、Koa、NestJS 搭建轻量级 API 服务，用于前后端分离项目的接口模拟或小型后台系统。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中间层 / BFF（Backend for Frontend）&lt;/strong&gt;：
在复杂业务中，用 Node.js 实现前后端解耦，比如统一处理接口聚合、鉴权、缓存。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSR / SSG 场景&lt;/strong&gt;：
使用 Next.js 或 Nuxt.js，借助 Node.js 渲染首屏，提升 SEO 和加载体验。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运维与脚本&lt;/strong&gt;：
编写部署脚本、自动生成文件、批量处理数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-具体任务"&gt;2. 具体任务&lt;/h3&gt;
&lt;p&gt;可以结合自身经历强调：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是否搭建过 Mock 服务，辅助前后端并行开发；&lt;/li&gt;
&lt;li&gt;是否写过中间层解决跨域、接口聚合问题；&lt;/li&gt;
&lt;li&gt;是否在工程化中写过 Node.js 工具脚本（如自动生成路由表、埋点收集脚本）；&lt;/li&gt;
&lt;li&gt;是否参与过服务端渲染或静态站点生成相关开发。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="3-收获和亮点"&gt;3. 收获和亮点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;对 &lt;strong&gt;事件驱动、非阻塞 I/O&lt;/strong&gt; 有更深理解，能写出高并发场景下的稳定服务；&lt;/li&gt;
&lt;li&gt;学会了在前端视角下如何更好地和后端衔接；&lt;/li&gt;
&lt;li&gt;在实际项目中通过 Node.js 提升了团队的开发效率（例如通过脚本工具减少重复劳动）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-84f9eb35b071"&gt;2. CSS 3D 变形有哪些常见的属性和方法？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS 3D 变形（3D Transform）是 CSS3 提供的一组属性，用来在三维空间中对元素进行旋转、缩放、平移、倾斜等操作。&lt;/p&gt;</description></item><item><title>百度-APP产品研发-秋招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-69/round-112/</link><pubDate>Tue, 19 Aug 2025 14:47:24 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-69/round-112/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-69/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-69/round-115/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 15 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-8b516cb7-fa94-4d68-929f-d3c628d1b7a2"&gt;1. 前端实现动画有哪些方式？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/8b516cb7-fa94-4d68-929f-d3c628d1b7a2"&gt;前端实现动画有哪些方式？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;前端开发中，实现动画的方法多种多样，每种方法都有其适用场景和优缺点。以下是一些常见的实现方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSS 动画&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;@keyframes&lt;/code&gt; 和 &lt;code&gt;animation&lt;/code&gt; 属性定义动画。&lt;/li&gt;
&lt;li&gt;优点：易于实现，性能好，易于维护。&lt;/li&gt;
&lt;li&gt;缺点：功能相对简单，难以实现复杂的交互动画。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSS 过渡（Transitions）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;transition&lt;/code&gt; 属性在状态变化时实现平滑过渡。&lt;/li&gt;
&lt;li&gt;优点：简单易用，性能优秀。&lt;/li&gt;
&lt;li&gt;缺点：只能用于状态变化的过渡，不适合复杂动画。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JavaScript 动画&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 JavaScript 直接操作 DOM 元素的样式属性实现动画。&lt;/li&gt;
&lt;li&gt;优点：灵活性高，可以控制动画的每一个细节。&lt;/li&gt;
&lt;li&gt;缺点：可能影响性能，需要更多的代码实现。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Web Animations API&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;Element.animate()&lt;/code&gt; 方法实现动画。&lt;/li&gt;
&lt;li&gt;优点：提供更丰富的动画控制和更一致的跨浏览器支持。&lt;/li&gt;
&lt;li&gt;缺点：兼容性不如 CSS 动画。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SVG 动画&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 SVG 元素和 SMIL（Synchronized Multimedia Integration Language）或 CSS 动画实现动画。&lt;/li&gt;
&lt;li&gt;优点：适合矢量图形动画，易于集成。&lt;/li&gt;
&lt;li&gt;缺点：浏览器支持和性能可能不如 CSS 动画。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Canvas&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 HTML &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; 元素和 JavaScript 绘制动画。&lt;/li&gt;
&lt;li&gt;优点：适合复杂的图形和游戏动画。&lt;/li&gt;
&lt;li&gt;缺点：实现复杂，需要手动管理每一帧的绘制。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSS 3D 变换&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>美团-零售-秋招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-68/round-111/</link><pubDate>Mon, 04 Aug 2025 07:49:59 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-68/round-111/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-68/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础知识，包括数据结构、网络协议、操作系统、JavaScript、CSS、React以及算法等方面。&lt;/p&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-2de490946b38"&gt;1. 数组和链表的区别，读取 和 删除 的时间复杂度&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据结构基础&lt;/strong&gt;：考察对数组和链表这两种基本数据结构概念的理解，包括它们的存储方式和特点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间复杂度分析&lt;/strong&gt;：评估数据结构在不同操作下的性能表现，这是衡量算法效率的关键指标。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;&lt;strong&gt;1.1 原理说明&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数组&lt;/strong&gt;：数组是一种将元素存储在连续内存空间中的数据结构。它通过索引来直接访问任意元素，因为所有元素的大小相同且物理地址连续，可以通过首地址和索引计算出元素的确切位置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链表&lt;/strong&gt;：链表是一种将元素存储在非连续内存空间中的数据结构。每个元素（称为节点）包含数据本身以及指向下一个元素的指针（或引用）。节点之间通过这些指针逻辑上连接起来，但不要求物理上连续。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;联系与区别&lt;/strong&gt;：数组和链表都是线性数据结构，用于有序地存储和组织数据。它们的主要区别在于内存的物理存储方式和由此带来的对元素访问、插入、删除操作的效率差异。数组支持随机访问，而链表只能顺序访问。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;为什么会出现这个技术需求或问题&lt;/strong&gt;：不同的数据存储和操作场景对数据结构有不同的性能要求。当需要快速随机访问数据时，数组由于其连续存储特性表现更优；而当需要频繁地进行插入和删除操作时，链表由于其灵活的指针连接方式，避免了大量元素移动，因此效率更高。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1.2 核心用法 + 示例代码&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;读取操作&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数组&lt;/strong&gt;：通过索引直接访问元素，时间复杂度为 &lt;code&gt;O(1)&lt;/code&gt;。无论数组大小，访问任何元素所需时间都是恒定的。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]); &lt;span style="color:#75715e"&gt;// 输出 30，直接访问，时间复杂度 O(1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;链表&lt;/strong&gt;：必须从链表的头部节点开始，沿着指针逐个遍历，直到找到目标元素。因此，时间复杂度为 &lt;code&gt;O(n)&lt;/code&gt;，其中 &lt;code&gt;n&lt;/code&gt; 是链表的长度。在最坏情况下，需要遍历整个链表。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;constructor&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;val&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;val&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;val&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;head&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;head&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;head&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;head&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;val&lt;/span&gt; &lt;span style="color:#f92672"&gt;!==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;val&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Not found&amp;#39;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 输出 30，需要遍历，时间复杂度 O(n)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;删除操作&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数组&lt;/strong&gt;：删除数组中的某个元素后，为了保持内存的连续性，其后的所有元素都需要向前移动以填补空缺。这个移动操作的时间复杂度为 &lt;code&gt;O(n)&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;splice&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 删除索引为2的元素（即3），后续元素（4, 5）前移，时间复杂度 O(n)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 输出 [1, 2, 4, 5]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;链表&lt;/strong&gt;：如果已知要删除节点的前一个节点，删除操作只需要修改前一个节点的指针，使其指向被删除节点的下一个节点。这个操作的时间复杂度为 &lt;code&gt;O(1)&lt;/code&gt;。如果需要先查找再删除，则总时间复杂度为 &lt;code&gt;O(n)&lt;/code&gt;（查找的开销）。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 假设我们有一个链表 1 -&amp;gt; 2 -&amp;gt; 3，我们要删除值为 2 的节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 模拟找到值为 1 的节点 (prevNode) 和值为 2 的节点 (nodeToDelete)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;headDelete&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node2&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node3&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;headDelete&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;node2&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prevNode&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;headDelete&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 值为 1 的节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodeToDelete&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node2&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 值为 2 的节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;prevNode&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodeToDelete&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 将 1 的 next 指向 3，时间复杂度 O(1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 现在链表变为 1 -&amp;gt; 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优势总结&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>美团-打车-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-67/round-110/</link><pubDate>Mon, 04 Aug 2025 07:21:50 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-67/round-110/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-67/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础、框架原理以及性能优化等方面的知识。&lt;/p&gt;
&lt;p&gt;本轮共 26 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-07fdb7cd02ac"&gt;1. 1. 项目的难点与亮点是什么？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;说明该题是主观型问题，不考&amp;quot;唯一标准答案&amp;quot;。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者的表达能力、思路系统性、技术理解和复盘能力。&lt;/li&gt;
&lt;li&gt;答题结构建议：首先简述项目背景，接着阐述难点（遇到的问题、如何解决、技术选型考量），再说明亮点（创新点、技术深度、业务价值），最后进行总结和反思。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我们团队在开发 XXX 项目时，有一个核心模块是 YYYY。这个模块的主要难点在于需要处理高并发的数据同步和复杂的权限控制逻辑。具体来说，我们面临的挑战包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;高并发数据同步&lt;/strong&gt;：在某个特定场景下，用户操作会导致大量数据实时更新，并且这些更新需要快速同步到多个客户端。初期方案在压力测试时出现了明显的延迟和数据不一致问题。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解决思路&lt;/strong&gt;：我们分析了瓶颈，发现是由于频繁的数据库写入和全量数据推送导致的。经过讨论，我们最终选择了基于 WebSocket 实现增量数据推送，并引入了消息队列（Kafka）来削峰填谷，后端对数据进行聚合后再批量写入。在前端，我们设计了一个轻量级的数据缓存层，只在接收到增量更新时局部刷新UI，大大减少了DOM操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术权衡&lt;/strong&gt;：我们对比过轮询、长轮询等方案，但它们在实时性和资源消耗上都不如 WebSocket 配合增量更新。虽然引入消息队列和 WebSocket 增加了系统复杂度，但在百万级并发场景下，它提供了更优的性能和更低的资源占用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;复杂的权限控制&lt;/strong&gt;：系统需要支持多维度、细粒度的用户权限，包括不同角色对数据和功能的访问权限，并且权限配置是动态可变的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解决思路&lt;/strong&gt;：我们设计了一套基于 RBAC（Role-Based Access Control）的权限模型，但在前端实现时，为了避免每次操作都去后端校验权限，我们引入了前端权限路由守卫和组件级权限指令。在用户登录时，后端会返回一个精简的权限列表，前端根据这个列表动态生成菜单、路由，并控制组件的可见性及交互。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术权衡&lt;/strong&gt;：这种前后端结合的权限控制方式，兼顾了安全性和用户体验。虽然前端增加了权限逻辑处理，但减少了不必要的后端请求，提升了页面响应速度。我们还考虑过将权限完全放到后端控制，但那样会导致频繁的网络请求，用户体验会下降。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;项目的亮点主要体现在两个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;技术深度与创新&lt;/strong&gt;：我们引入的 WebSocket + Kafka 的实时数据同步方案，有效地支撑了高并发场景下的数据一致性和实时性要求，这是项目在技术上的一大突破。此外，我们还自主研发了一套可视化配置工具，让业务人员可以灵活配置数据同步规则，极大地提高了运营效率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;业务价值与用户体验提升&lt;/strong&gt;：通过解决上述难点，我们成功将核心页面的数据实时同步延迟从平均 5 秒降低到 500 毫秒以内，用户在操作时的卡顿感几乎消除，大幅提升了用户满意度。同时，权限系统的灵活配置也让业务扩展变得更加便捷，支持了新业务的快速上线。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在整个过程中，我们团队通过深入分析、多方案对比和持续优化，不仅攻克了技术难点，也为业务带来了实际的价值。这次经历让我对高并发系统设计和复杂权限管理有了更深刻的理解，也锻炼了我在权衡技术方案和解决实际问题方面的能力。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-7df4d539008c"&gt;2. 2. 解决难点时，是否对比过多种方案？最终选择的方案有何权衡？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;说明该题是主观型问题，不考&amp;quot;唯一标准答案&amp;quot;。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者解决问题的思路、方案对比能力、技术选型和权衡能力，以及对项目实际情况的理解。&lt;/li&gt;
&lt;li&gt;答题结构建议：首先选择一个具体的项目难点，围绕该难点，阐述曾考虑的多种解决方案，对比它们的优劣（技术、成本、风险等），最终说明选择当前方案的理由及权衡过程，并可提及后续优化方向。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在我的前端项目中，曾遇到一个挑战，就是如何高效地管理和渲染大规模的动态表单。传统的方案是直接通过 JSON 配置动态生成表单项，但这在表单项过多、层级嵌套复杂时，会导致渲染性能下降，并且表单校验逻辑难以统一管理。&lt;/p&gt;
&lt;p&gt;当时我们主要对比了以下几种方案：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;方案一：纯粹的 JSON Schema 驱动，一次性渲染&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：配置简单直观，后端可以方便地控制表单结构。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：对于包含上百个字段甚至更多字段的复杂表单，一次性渲染会导致首次加载时间过长，页面卡顿。当表单数据频繁变化时，DOM 更新开销大，用户体验差。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权衡&lt;/strong&gt;：虽然开发成本低，但性能瓶颈明显，不适用于我们目标中的大型复杂表单。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;方案二：基于组件化和局部更新&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-5年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-103/</link><pubDate>Mon, 28 Jul 2025 12:42:07 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-103/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-104/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; React 生命周期、react hooks、JSX、react 渲染机制、React函数组件更新、react 组件设计模式&lt;/p&gt;
&lt;p&gt;本轮共 38 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-0e1759e87727"&gt;1. 你参与的主要项目是什么？是桌面端还是移动端项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-d691062b1d66"&gt;2. 在项目中主要使用了哪些技术栈&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-3ee00ddb36c7"&gt;3. 你对 Vue 有多少了解&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vue 是数据驱动 + 响应式的组件化框架，适合快速构建中大型项目&lt;br&gt;&lt;/li&gt;
&lt;li&gt;熟悉其核心机制：响应式原理、组件生命周期、指令语法、虚拟 DOM&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握 Vue Router、Vuex/Pinia 等配套生态工具&lt;br&gt;&lt;/li&gt;
&lt;li&gt;能区分并熟练使用 Vue 2 和 Vue 3 的开发模式&lt;br&gt;&lt;/li&gt;
&lt;li&gt;具备优化性能、提升可维护性的工程意识&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;探查候选人对 Vue 核心原理、语法机制的理解深度&lt;br&gt;&lt;/li&gt;
&lt;li&gt;判断是否具备实战经验、组件开发能力、性能优化能力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;涵盖响应式系统、组件通信、生命周期、指令系统、虚拟 DOM、Diff 等关键技术点&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Vue 生态栈是否熟悉，如 Vue Router、Vuex / Pinia、Composition API、Vue 3 升级等&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-vue-框架的整体认知"&gt;2.1 Vue 框架的整体认知&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vue 是一个 &lt;strong&gt;轻量、渐进式的前端框架&lt;/strong&gt;，核心关注 View 层，易学易用，适合快速开发中大型应用&lt;/li&gt;
&lt;li&gt;支持响应式绑定、组件化开发、指令系统、虚拟 DOM、跨平台（如 H5、小程序）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vue 的核心组成包括：&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-3年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-63/round-101/</link><pubDate>Mon, 28 Jul 2025 12:26:34 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-63/round-101/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-63/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-63/round-102/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; react 事件机制、React 生命周期、state 与 props&lt;/p&gt;
&lt;p&gt;本轮共 13 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-ee8affda6741"&gt;1. 实现全屏水平垂直居中、宽高为屏幕宽度一半的正方形&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;利用 &lt;code&gt;vw&lt;/code&gt; 单位定义宽高，保证正方形且相对视口大小&lt;/li&gt;
&lt;li&gt;Flexbox 和绝对定位 + transform 是常用居中方案&lt;/li&gt;
&lt;li&gt;重置默认 margin 和设置容器高度保证布局准确&lt;/li&gt;
&lt;li&gt;任选方案均可，Flexbox 代码简洁，绝对定位兼容性好&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;掌握 CSS 布局基础知识&lt;br&gt;&lt;/li&gt;
&lt;li&gt;熟悉视口单位（vw、vh）的使用&lt;br&gt;&lt;/li&gt;
&lt;li&gt;理解水平垂直居中多种实现方式&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解盒模型和尺寸计算&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-需求分析"&gt;2.1 需求分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;元素宽度和高度为屏幕宽度的 50%（即 50vw）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;元素是正方形，宽高相等&lt;br&gt;&lt;/li&gt;
&lt;li&gt;水平和垂直方向均居中显示&lt;br&gt;&lt;/li&gt;
&lt;li&gt;兼容主流现代浏览器&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-代码实现示例"&gt;2.2 代码实现示例&lt;/h3&gt;
&lt;h4 id="方法一使用-flexbox"&gt;方法一：使用 Flexbox&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;container&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;square&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;html&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;body&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vh&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;justify-content&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 水平居中 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;align-items&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 垂直居中 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 保证正方形 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#4CAF50&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="方法二使用绝对定位--transform"&gt;方法二：使用绝对定位 + transform&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;square&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;absolute&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#2196F3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;transform&lt;/span&gt;: translate(&lt;span style="color:#ae81ff"&gt;-50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;-50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;html&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;body&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vh&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="23-说明"&gt;2.3 说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;50vw&lt;/code&gt; 表示视口宽度的一半&lt;/li&gt;
&lt;li&gt;Flexbox 方案利用容器的弹性布局实现简单居中&lt;/li&gt;
&lt;li&gt;绝对定位方案通过 &lt;code&gt;top:50%&lt;/code&gt;, &lt;code&gt;left:50%&lt;/code&gt; 定位中心点，再用 &lt;code&gt;transform&lt;/code&gt; 修正偏移&lt;/li&gt;
&lt;li&gt;两种方案均保证元素在视口中央且尺寸为屏幕宽度一半的正方形&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三常见误区或面试陷阱"&gt;三、常见误区或面试陷阱&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;忽略 viewport 单位，使用百分比 &lt;code&gt;%&lt;/code&gt; 宽高导致高度受父元素限制&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;margin: auto&lt;/code&gt; 只实现水平居中，未垂直居中&lt;/li&gt;
&lt;li&gt;transform 偏移值写错方向或单位&lt;/li&gt;
&lt;li&gt;未重置 &lt;code&gt;html, body&lt;/code&gt; 的 margin 和高度，导致布局异常&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-efad8bc5b4fe"&gt;2. 如何通过 padding-bottom 实现自适应正方形&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;百分比 padding-bottom 是相对于元素宽度计算的&lt;/li&gt;
&lt;li&gt;设置宽度，padding-bottom 等于宽度比例即可实现宽高比&lt;/li&gt;
&lt;li&gt;纯 CSS 实现响应式正方形，无需 JS 计算&lt;/li&gt;
&lt;li&gt;配合 position 及 transform 可实现内部内容居中&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点-1"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;理解 CSS 盒模型及百分比 padding 的计算规则&lt;br&gt;&lt;/li&gt;
&lt;li&gt;熟悉通过内边距（padding）比例实现自适应高度的布局技巧&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握纯 CSS 无需固定高度实现宽高比控制的方法&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解响应式设计及视口适配相关概念&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案-1"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-核心原理说明"&gt;2.1 核心原理说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;百分比 padding 的高度计算基于元素的宽度&lt;/strong&gt;&lt;br&gt;
例如，&lt;code&gt;padding-bottom: 100%&lt;/code&gt; 表示内边距底部高度是元素自身宽度的 100%&lt;br&gt;&lt;/li&gt;
&lt;li&gt;利用这一特性，设置一个元素的宽度，然后用 &lt;code&gt;padding-bottom&lt;/code&gt; 来控制高度，从而实现固定宽高比（正方形为 1:1）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;这种方式不依赖固定高度或 JS，纯 CSS 实现响应式正方形&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-具体实现方式"&gt;2.2 具体实现方式&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;square&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 宽度为视口宽度的一半 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding-bottom&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 内边距底部为宽度的 100%，实现高度与宽度相等 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#f60&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;relative&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 便于放置绝对定位内容（如文字） */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* 如果需要内部内容绝对居中，可添加： */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;content&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;absolute&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;transform&lt;/span&gt;: translate(&lt;span style="color:#ae81ff"&gt;-50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;-50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="23-使用场景"&gt;2.3 使用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;自适应正方形容器&lt;/li&gt;
&lt;li&gt;图片或视频占位框&lt;/li&gt;
&lt;li&gt;响应式卡片、图标区域布局&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三常见误区或面试陷阱-1"&gt;三、常见误区或面试陷阱&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;误以为 padding 百分比是基于高度计算（实际上是基于宽度）&lt;/li&gt;
&lt;li&gt;忽略内容本身不占高度，需要通过 &lt;code&gt;position: relative&lt;/code&gt; 和绝对定位解决内容布局&lt;/li&gt;
&lt;li&gt;没有设置元素的 &lt;code&gt;width&lt;/code&gt;，导致 padding 计算无意义&lt;/li&gt;
&lt;li&gt;使用固定 &lt;code&gt;height&lt;/code&gt; 反而破坏响应式效果&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-c8954730cddb"&gt;3. 若要求正方形内嵌图片保持比例且不拉伸，如何实现&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;容器用 padding-bottom 创建自适应正方形&lt;/li&gt;
&lt;li&gt;图片使用 &lt;code&gt;object-fit: contain&lt;/code&gt; 保持比例且不拉伸&lt;/li&gt;
&lt;li&gt;绝对定位图片居中显示，宽高100%填充容器&lt;/li&gt;
&lt;li&gt;设置 &lt;code&gt;overflow: hidden&lt;/code&gt; 避免溢出&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点-2"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;理解图片的默认渲染行为及尺寸适配&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握 CSS 中图片等媒体对象的缩放控制属性（object-fit）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;熟悉容器布局，确保图片在固定宽高正方形内自适应显示&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解响应式设计和兼容性考虑&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案-2"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-核心概念说明"&gt;2.1 核心概念说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;图片默认行为&lt;/strong&gt;：图片按原始宽高比显示，若强制设置宽高可能导致变形&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;object-fit&lt;/code&gt; 属性&lt;/strong&gt;：用于控制替换元素（如 img、video）内容的填充方式&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;object-fit: contain&lt;/code&gt; 保持图片比例，完整显示，可能留空白&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;object-fit: cover&lt;/code&gt; 保持比例，填满容器，超出部分裁剪&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合容器尺寸和 &lt;code&gt;object-fit&lt;/code&gt; 可灵活控制图片展示效果&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-具体实现示例"&gt;2.2 具体实现示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;square&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;img&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;your-image.jpg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;alt&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;示例图片&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding-bottom&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 自适应正方形 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;relative&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;overflow&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;hidden&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 防止图片溢出 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; &lt;span style="color:#f92672"&gt;img&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;absolute&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;object-fit&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;contain&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 保持比例且不拉伸 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;transform&lt;/span&gt;: translate(&lt;span style="color:#ae81ff"&gt;-50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;-50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="23-说明-1"&gt;2.3 说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;padding-bottom&lt;/code&gt; 创建正方形容器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;position: relative&lt;/code&gt; + &lt;code&gt;position: absolute&lt;/code&gt; 定位图片，方便居中&lt;/li&gt;
&lt;li&gt;图片宽高设为 100%，配合 &lt;code&gt;object-fit: contain&lt;/code&gt; 保持原始比例且不被拉伸&lt;/li&gt;
&lt;li&gt;&lt;code&gt;overflow: hidden&lt;/code&gt; 防止图片超出容器边界显示&lt;/li&gt;
&lt;li&gt;可根据需求改为 &lt;code&gt;object-fit: cover&lt;/code&gt; 实现填充并裁剪效果&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三常见误区或面试陷阱-2"&gt;三、常见误区或面试陷阱&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;不设置 &lt;code&gt;object-fit&lt;/code&gt;，直接用 &lt;code&gt;width&lt;/code&gt; 和 &lt;code&gt;height&lt;/code&gt; 100%，图片可能被拉伸变形&lt;/li&gt;
&lt;li&gt;忽略容器定位，导致图片无法居中或布局错乱&lt;/li&gt;
&lt;li&gt;未设置 &lt;code&gt;overflow: hidden&lt;/code&gt;，图片溢出影响页面布局&lt;/li&gt;
&lt;li&gt;误用 &lt;code&gt;background-image&lt;/code&gt; 和 &lt;code&gt;background-size&lt;/code&gt;，与 img 标签区别不清&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-417ebda0-3f2d-48d3-95ec-ae1838bf39cb"&gt;4. 怎么理解回流跟重绘？什么场景下会触发？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/417ebda0-3f2d-48d3-95ec-ae1838bf39cb"&gt;怎么理解回流跟重绘？什么场景下会触发？&lt;/a&gt;&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-2年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-62/round-99/</link><pubDate>Mon, 28 Jul 2025 12:07:25 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-62/round-99/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-62/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-62/round-100/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; react hooks、WeakMap 和 WeakSet&lt;/p&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-fb756a4e7c84"&gt;1. ES6相关属性都用过那些&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;熟悉 ES6 关键新特性和语法糖&lt;/li&gt;
&lt;li&gt;了解特性设计目的，提升代码可维护性和性能&lt;/li&gt;
&lt;li&gt;结合项目场景合理运用，避免滥用带来的副作用&lt;/li&gt;
&lt;li&gt;使用 ESLint 及 Babel 保证兼容性和规范&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全面了解 ES6（ECMAScript 2015）新特性&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;掌握模块化、变量声明、函数、对象、数组、字符串、类、Promise 等核心特性&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能说明特性使用场景、优势及与旧版本对比&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;具备在项目中合理应用 ES6 特性的能力&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="11-变量声明"&gt;1.1 变量声明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;let&lt;/code&gt; 和 &lt;code&gt;const&lt;/code&gt;：块级作用域，解决 &lt;code&gt;var&lt;/code&gt; 变量提升和重复声明问题&lt;/li&gt;
&lt;li&gt;推荐使用 &lt;code&gt;const&lt;/code&gt; 声明常量，&lt;code&gt;let&lt;/code&gt; 声明可变变量，避免全局污染&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-模板字符串template-literals"&gt;1.2 模板字符串（Template Literals）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用反引号 &lt;code&gt;`&lt;/code&gt; 支持多行字符串和内嵌表达式 &lt;code&gt;${expr}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;替代传统字符串拼接，提升可读性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="13-解构赋值destructuring"&gt;1.3 解构赋值（Destructuring）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;支持数组和对象解构，简化变量赋值&lt;/li&gt;
&lt;li&gt;常用于函数参数处理、数据提取&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="14-箭头函数arrow-functions"&gt;1.4 箭头函数（Arrow Functions）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;简洁函数表达式，自动绑定 &lt;code&gt;this&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;不可作为构造函数，不绑定 &lt;code&gt;arguments&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;常用于回调和函数简写&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="15-扩展运算符spread和剩余参数rest"&gt;1.5 扩展运算符（Spread）和剩余参数（Rest）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;扩展运算符 &lt;code&gt;...&lt;/code&gt; 用于数组和对象展开&lt;/li&gt;
&lt;li&gt;剩余参数用于函数参数收集&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="16-对象字面量增强"&gt;1.6 对象字面量增强&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;属性简写、方法简写、计算属性名&lt;/li&gt;
&lt;li&gt;支持简洁声明和动态键名&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="17-类class"&gt;1.7 类（Class）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ES6 引入基于原型的语法糖，支持继承、构造函数、静态方法&lt;/li&gt;
&lt;li&gt;提升面向对象编程体验&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="18-promise-和异步编程"&gt;1.8 Promise 和异步编程&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用于异步流程控制，解决回调地狱&lt;/li&gt;
&lt;li&gt;支持链式调用和错误捕获&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="19-模块module"&gt;1.9 模块（Module）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;import&lt;/code&gt; 和 &lt;code&gt;export&lt;/code&gt; 语法，支持静态分析和按需加载&lt;/li&gt;
&lt;li&gt;替代传统的 CommonJS、AMD 模块规范&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="110-symbol-类型"&gt;1.10 Symbol 类型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;新增基本类型，表示独一无二的值&lt;/li&gt;
&lt;li&gt;常用于定义对象的私有属性和常量&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="111-set-和-map-数据结构"&gt;1.11 Set 和 Map 数据结构&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Set：无重复元素集合&lt;/li&gt;
&lt;li&gt;Map：键值对集合，键可以是任意类型&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="112-iterator-和-generator"&gt;1.12 Iterator 和 Generator&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;统一遍历接口&lt;/li&gt;
&lt;li&gt;Generator 生成器函数，用于异步流程和惰性计算&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="113-其他"&gt;1.13 其他&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;for...of&lt;/code&gt; 循环：遍历可迭代对象&lt;/li&gt;
&lt;li&gt;默认参数和函数参数尾逗号&lt;/li&gt;
&lt;li&gt;数组新增方法如 &lt;code&gt;Array.from&lt;/code&gt;、&lt;code&gt;find&lt;/code&gt;、&lt;code&gt;findIndex&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三常见使用场景及优势"&gt;三、常见使用场景及优势&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;使用场景&lt;/th&gt;
&lt;th&gt;优势与改进点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;let&lt;/code&gt;/&lt;code&gt;const&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;代替 &lt;code&gt;var&lt;/code&gt;，块级作用域变量声明&lt;/td&gt;
&lt;td&gt;避免变量提升和作用域污染&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模板字符串&lt;/td&gt;
&lt;td&gt;拼接复杂字符串和多行文本&lt;/td&gt;
&lt;td&gt;可读性高，减少错误&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;解构赋值&lt;/td&gt;
&lt;td&gt;参数提取、数组拆包、函数返回值拆分&lt;/td&gt;
&lt;td&gt;代码简洁，语义清晰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;箭头函数&lt;/td&gt;
&lt;td&gt;回调函数、简化函数定义&lt;/td&gt;
&lt;td&gt;自动绑定 &lt;code&gt;this&lt;/code&gt;，代码更短&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扩展运算符&lt;/td&gt;
&lt;td&gt;数组合并、对象拷贝&lt;/td&gt;
&lt;td&gt;简化代码，避免手动循环&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Promise&lt;/td&gt;
&lt;td&gt;异步请求、链式调用&lt;/td&gt;
&lt;td&gt;解决回调地狱，增强异步流程可读性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模块化&lt;/td&gt;
&lt;td&gt;项目拆分、代码复用&lt;/td&gt;
&lt;td&gt;标准化模块，支持静态分析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set/Map&lt;/td&gt;
&lt;td&gt;需要高效查找、去重、键值映射的场景&lt;/td&gt;
&lt;td&gt;性能优于传统对象和数组&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="四常见误区或面试陷阱"&gt;四、常见误区或面试陷阱&lt;/h2&gt;
&lt;h4 id="-误区一滥用箭头函数导致-this-绑定错误"&gt;❌ 误区一：滥用箭头函数导致 &lt;code&gt;this&lt;/code&gt; 绑定错误&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;不适合需要动态 &lt;code&gt;this&lt;/code&gt; 的场景（如对象方法）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-误区二未充分利用解构赋值写出冗长代码"&gt;❌ 误区二：未充分利用解构赋值，写出冗长代码&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;理解解构赋值提升代码清晰度&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-误区三promise-误用未捕获异常导致异常丢失"&gt;❌ 误区三：Promise 误用未捕获异常，导致异常丢失&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;应正确使用 &lt;code&gt;.catch&lt;/code&gt; 或 &lt;code&gt;try...catch&lt;/code&gt; 包裹 &lt;code&gt;async/await&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-5fadc194d07e"&gt;2. 为什么WeakMap的键必须是对象&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;WeakMap 键必须是对象，因为弱引用机制只能作用于对象&lt;/li&gt;
&lt;li&gt;对基本类型无法进行弱引用，无法参与垃圾回收机制&lt;/li&gt;
&lt;li&gt;WeakMap 设计用于保存对象私有数据，避免内存泄漏&lt;/li&gt;
&lt;li&gt;与普通 Map 区别在于弱引用和不可枚举特性&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点-1"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;理解 WeakMap 的设计初衷和底层实现机制&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;掌握 WeakMap 与普通 Map 的区别&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;了解 JavaScript 垃圾回收机制与弱引用的关系&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能说明 WeakMap 键限制为对象的技术原因及应用场景&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案-1"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="11-weakmap-的基本概念"&gt;1.1 WeakMap 的基本概念&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;WeakMap 是一种键为对象，值任意的数据结构&lt;/li&gt;
&lt;li&gt;与普通 Map 不同，WeakMap 对键对象的引用是“弱引用”&lt;/li&gt;
&lt;li&gt;当键对象不存在其它引用时，能被垃圾回收器回收，避免内存泄漏&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-键必须是对象的原因"&gt;1.2 键必须是对象的原因&lt;/h3&gt;
&lt;h4 id="1弱引用必须指向对象"&gt;1）弱引用必须指向对象&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JavaScript 的弱引用机制只能对对象类型生效&lt;/li&gt;
&lt;li&gt;基本类型（如字符串、数字）是值类型，无法被弱引用追踪和回收&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2垃圾回收机制要求"&gt;2）垃圾回收机制要求&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;只有对象才存在垃圾回收标记和生命周期管理&lt;/li&gt;
&lt;li&gt;WeakMap 通过弱引用允许键对象在无外部引用时自动回收&lt;/li&gt;
&lt;li&gt;如果允许基本类型作为键，则无法做到弱引用，违背 WeakMap 设计初衷&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3设计意图和使用场景"&gt;3）设计意图和使用场景&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;用于存储与对象相关联的私有数据，避免内存泄漏&lt;/li&gt;
&lt;li&gt;例如框架中保存某个 DOM 节点的元数据，DOM 节点销毁时对应数据自动释放&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="13-weakmap-与-map-的区别"&gt;1.3 WeakMap 与 Map 的区别&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;Map&lt;/th&gt;
&lt;th&gt;WeakMap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;键类型&lt;/td&gt;
&lt;td&gt;任意类型&lt;/td&gt;
&lt;td&gt;只能是对象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;是否可枚举&lt;/td&gt;
&lt;td&gt;可遍历所有键值&lt;/td&gt;
&lt;td&gt;不可遍历&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;引用强度&lt;/td&gt;
&lt;td&gt;对键保持强引用，阻止垃圾回收&lt;/td&gt;
&lt;td&gt;对键保持弱引用，不阻止垃圾回收&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;适用场景&lt;/td&gt;
&lt;td&gt;普通键值映射&lt;/td&gt;
&lt;td&gt;关联对象私有数据，自动回收&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="14-常见误区或面试陷阱"&gt;1.4 常见误区或面试陷阱&lt;/h3&gt;
&lt;h4 id="-误区一认为-weakmap-可以用基本类型作为键"&gt;❌ 误区一：认为 WeakMap 可以用基本类型作为键&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;会导致运行时错误，WeakMap 只能接受对象作为键&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-误区二误用-weakmap-导致内存泄漏"&gt;❌ 误区二：误用 WeakMap 导致内存泄漏&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;忽略 WeakMap 不可遍历特性，误判数据存在与否&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-bf18925ca33f"&gt;3. Map支持哪些非对象键&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Map 支持所有基本类型和对象作为键&lt;/li&gt;
&lt;li&gt;包括字符串、数字、布尔值、Symbol、null、undefined&lt;/li&gt;
&lt;li&gt;与 WeakMap 只能用对象键不同，Map 更灵活&lt;/li&gt;
&lt;li&gt;理解键类型和对应的行为差异，避免键冲突&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点-2"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;理解 JavaScript Map 的键类型及其存储机制&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;掌握 Map 与 WeakMap 键的差异&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;了解基本类型和对象类型作为键的行为和区别&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能说明非对象键在 Map 中的实际使用场景&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案-2"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="11-map-键的类型支持"&gt;1.1 Map 键的类型支持&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Map 的键可以是任意值，包括基本类型和对象类型&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-1年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-61/round-97/</link><pubDate>Mon, 28 Jul 2025 11:47:07 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-61/round-97/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-61/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-61/round-98/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; Webpack与Vite、事件循环、跨域通信&lt;/p&gt;
&lt;p&gt;本轮共 16 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-80619f2d22f7"&gt;1. 项目中遇到了哪些技术难题，是如何解决的&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;STAR法则&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8eccdcf5f029"&gt;2. 在解决这些技术难题的过程中，有没有尝试过其他解决方案&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-97e442c116a5"&gt;3. 项目中是如何进行团队协作的&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-ff0b3dbd2346"&gt;4. 在团队协作中，有没有遇到过沟通不畅或者意见不合的情况？是如何解决的&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-78a32c9021bc"&gt;5. webpack 的 plugin 了解吗&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Plugin 是 Webpack 扩展机制，贯穿构建全过程&lt;/li&gt;
&lt;li&gt;核心结构是类 + &lt;code&gt;apply(compiler)&lt;/code&gt; + Tapable 钩子&lt;/li&gt;
&lt;li&gt;常见生命周期钩子：&lt;code&gt;compile&lt;/code&gt;、&lt;code&gt;emit&lt;/code&gt;、&lt;code&gt;done&lt;/code&gt; 等&lt;/li&gt;
&lt;li&gt;可用于注入变量、分析构建、生成资源、操作产物等&lt;/li&gt;
&lt;li&gt;熟悉 compiler 与 compilation 的概念&lt;/li&gt;
&lt;li&gt;可结合实际项目经验举例说明插件使用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;是否理解 Plugin 在 Webpack 中的作用和工作机制&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plugin 是 Webpack 最核心的扩展机制之一&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;是否掌握编写 Plugin 的基本方法和生命周期&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;了解 &lt;code&gt;compiler&lt;/code&gt;、&lt;code&gt;compilation&lt;/code&gt;、钩子（hooks）等概念&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;能否结合实际项目场景说明使用插件的案例和目的&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>滴滴-社招-5年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-60/round-95/</link><pubDate>Mon, 28 Jul 2025 06:01:19 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-60/round-95/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-60/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-60/round-96/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 作用域链与闭包、全方位解读this、函数柯里化、原型链与继承、DOM操作、深拷贝/浅拷贝、call、apply和bind&lt;/p&gt;
&lt;p&gt;本轮共 24 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-a5330a58-5be0-4f4f-8394-43392311ddaa"&gt;1. 深拷贝浅拷贝有什么区别？怎么实现深拷贝？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/a5330a58-5be0-4f4f-8394-43392311ddaa"&gt;深拷贝浅拷贝有什么区别？怎么实现深拷贝？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;JS数据类型分别基本数据类型和引用数据类型，基本数据类型保存的是值，引用类型保存的是引用地址(this指针)。&lt;/p&gt;
&lt;p&gt;浅拷贝共用一个引用地址，深拷贝会创建新的内存地址。&lt;/p&gt;
&lt;h4 id="浅拷贝方法"&gt;浅拷贝方法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;直接对象复制&lt;/li&gt;
&lt;li&gt;Object.assign&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="深拷贝"&gt;深拷贝&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JSON.stringify转为字符串再JSON.parse&lt;/li&gt;
&lt;li&gt;深度递归遍历&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一数据类型存储"&gt;一、数据类型存储&lt;/h2&gt;
&lt;p&gt;前面文章我们讲到，&lt;code&gt;JavaScript&lt;/code&gt;中存在两大数据类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基本类型&lt;/li&gt;
&lt;li&gt;引用类型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基本类型数据保存在在栈内存中&lt;/p&gt;
&lt;p&gt;引用类型数据保存在堆内存中，引用数据类型的变量是一个指向堆内存中实际对象的引用，存在栈中&lt;/p&gt;
&lt;h2 id="二浅拷贝"&gt;二、浅拷贝&lt;/h2&gt;
&lt;p&gt;浅拷贝，指的是创建新的数据，这个数据有着原始数据属性值的一份精确拷贝&lt;/p&gt;
&lt;p&gt;如果属性是基本类型，拷贝的就是基本类型的值。如果属性是引用类型，拷贝的就是内存地址&lt;/p&gt;
&lt;p&gt;即浅拷贝是拷贝一层，深层次的引用类型则共享内存地址&lt;/p&gt;
&lt;p&gt;下面简单实现一个浅拷贝&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;shallowClone&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;hasOwnProperty&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;)){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在&lt;code&gt;JavaScript&lt;/code&gt;中，存在浅拷贝的现象有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Object.assign&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Array.prototype.slice()&lt;/code&gt;, &lt;code&gt;Array.prototype.concat()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用拓展运算符实现的复制&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="objectassign"&gt;Object.assign&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;age&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nature&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;smart&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;good&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name1&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;fx&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name2&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;xka&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;love&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;fx is a great girl&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Object.&lt;span style="color:#a6e22e"&gt;assign&lt;/span&gt;({}, &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="slice"&gt;slice()&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;One&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Two&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Three&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;slice&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;love&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;Two&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;love&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="concat"&gt;concat()&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;One&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Two&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Three&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;concat&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;love&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;Two&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;love&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="拓展运算符"&gt;拓展运算符&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;One&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Two&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Three&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [...&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;love&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;Two&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;love&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="三深拷贝"&gt;三、深拷贝&lt;/h2&gt;
&lt;p&gt;深拷贝开辟一个新的栈，两个对象的属性完全相同，但是对应两个不同的地址，修改一个对象的属性，不会改变另一个对象的属性&lt;/p&gt;</description></item><item><title>滴滴-社招-3年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/round-92/</link><pubDate>Mon, 28 Jul 2025 03:15:10 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/round-92/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/round-93/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; z-index、布局技巧、Flexbox、优化性能、react hooks、浏览器渲染过程、浏览器的缓存机制、浏览器的垃圾回收机制&lt;/p&gt;
&lt;p&gt;本轮共 11 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-920e774f1156"&gt;1. 讲一下可视化搭建平台中魔方组件的设计与实现难点&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-6898841d5b91"&gt;2. 如何解决多模块叠加时的z-index管理问题&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;z-index&lt;/code&gt; 基于层叠上下文，简单数字不能保证全局一致性&lt;/li&gt;
&lt;li&gt;建立统一 z-index 管理系统（如 Z_INDEX_MAP）是可维护的关键&lt;/li&gt;
&lt;li&gt;模块内部创建局部 stacking context，避免全局冲突&lt;/li&gt;
&lt;li&gt;动态模块如拖拽、浮层应使用自动 z-index 分配策略&lt;/li&gt;
&lt;li&gt;避免滥用 z-index，建议结合 portal、绝对定位和容器设计实现可控叠加&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;面试官想了解你在复杂 UI 组件系统中的图层管理策略&lt;/li&gt;
&lt;li&gt;探查你对 &lt;code&gt;z-index&lt;/code&gt; 的工作机制、层级上下文（stacking context）的理解&lt;/li&gt;
&lt;li&gt;是否具备系统化组织多模块图层关系的经验，能避免冲突和错乱&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一z-index-背后机制与问题本质"&gt;一、z-index 背后机制与问题本质&lt;/h4&gt;
&lt;h5 id="1-z-index-的作用机制"&gt;1. z-index 的作用机制&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;z-index&lt;/code&gt; 定义元素在“同一层叠上下文（stacking context）”中的前后顺序&lt;/li&gt;
&lt;li&gt;层叠上下文由具有特定属性的元素（如&lt;code&gt;position: relative/absolute/fixed&lt;/code&gt; + &lt;code&gt;z-index&lt;/code&gt;）创建&lt;/li&gt;
&lt;li&gt;每个层叠上下文是独立的，只影响自身子元素的层叠关系&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="2-可视化搭建系统的典型挑战"&gt;2. 可视化搭建系统的典型挑战&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;多模块（如弹窗、悬浮面板、组件拖拽层、选中态）频繁叠加，若统一用裸 &lt;code&gt;z-index&lt;/code&gt; 数字管理，非常容易：
&lt;ul&gt;
&lt;li&gt;维护混乱&lt;/li&gt;
&lt;li&gt;层级冲突（某组件盖住了弹窗）&lt;/li&gt;
&lt;li&gt;模块互相影响，难以解耦&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="二系统化的-z-index-管理方案"&gt;二、系统化的 z-index 管理方案&lt;/h4&gt;
&lt;h5 id="1-建立统一的层级管理规范z-index-map"&gt;1. 建立统一的层级管理规范（z-index Map）&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;在系统中定义一套统一的 z-index 枚举表，例如：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Z_INDEX_MAP&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;base&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;component&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;floatingPanel&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;100&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;modal&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;1000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;tooltip&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;2000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dragLayer&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;3000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;globalMask&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;9999&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;所有模块只能从该映射中引用 z-index，禁止硬编码数字，避免冲突&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="2-模块隔离建立明确的层叠上下文边界"&gt;2. 模块隔离，建立明确的层叠上下文边界&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;position: relative/absolute&lt;/code&gt; + &lt;code&gt;z-index&lt;/code&gt;，每个模块在其容器内控制层级&lt;/li&gt;
&lt;li&gt;避免所有元素在一个全局层叠上下文中争夺 z-index&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="3-动态-z-index-分配机制如拖拽时临时置顶"&gt;3. 动态 z-index 分配机制（如拖拽时临时置顶）&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;为拖拽、临时弹出等模块动态分配最高层级，例如：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dynamicZIndex&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Z_INDEX_MAP&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dragLayer&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getNextZIndex() {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dynamicZIndex&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;使多个拖拽元素在交互中可动态置顶，不影响整体秩序&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="4-可视化调试工具辅助"&gt;4. 可视化调试工具辅助&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;引入 DevTool 插件或内嵌 z-index 层级可视化辅助组件，用不同颜色或 label 显示当前模块层级，便于调试&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="三z-index-冲突的实际案例与应对策略"&gt;三、z-index 冲突的实际案例与应对策略&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：浮层 A（z-index: 200）被浮层 B（z-index: 100）遮挡&lt;/p&gt;</description></item><item><title>美团-本地商业-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-58/round-91/</link><pubDate>Mon, 28 Jul 2025 02:44:46 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-58/round-91/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-58/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要聚焦于前端中高级技术深度和实际项目经验的考察。重点涵盖了&lt;strong&gt;前端工程化与性能优化&lt;/strong&gt;（如Webpack优化、首屏加载、HTTP缓存、CDN等）、&lt;strong&gt;JavaScript运行机制与高级特性&lt;/strong&gt;（事件循环、宏微任务、Vue 2/3响应式原理、数组操作等），以及&lt;strong&gt;Web安全与系统设计&lt;/strong&gt;（如XSS防御、HTTPS原理、持久化登录系统设计）。此外，还深入探讨了&lt;strong&gt;跨平台开发&lt;/strong&gt;（Uni-App/Taro原理及选型）和&lt;strong&gt;微前端架构&lt;/strong&gt;的关键考量点。面试官旨在通过这些题目，全面评估候选人在复杂业务场景下的技术选型、问题分析与解决能力，以及对前端底层原理和安全实践的掌握程度。&lt;/p&gt;
&lt;p&gt;本轮共 18 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-29dfa5962bad"&gt;1. 简单介绍你的技术背景和项目经验。&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;说明&lt;/strong&gt;：该题是典型的主观型问题，没有唯一的标准答案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;考察目标&lt;/strong&gt;：面试官主要考察答题者的自我认知、表达能力、技术广度与深度、以及对自身项目经验的复盘和总结能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;答题结构建议&lt;/strong&gt;：建议围绕&amp;quot;我是谁&amp;quot;、&amp;ldquo;我会什么&amp;rdquo;、&amp;ldquo;我做过什么&amp;quot;三个核心点展开，并结合具体项目经验突出个人优势和亮点。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;很高兴能有机会介绍一下我的技术背景和项目经验。我叫[你的名字]，毕业于[你的学校和专业]，在校期间我对前端技术产生了浓厚兴趣，系统学习了HTML、CSS和JavaScript基础。毕业后，我加入了[你的公司名称]，至今有[X]年的前端开发经验。&lt;/p&gt;
&lt;p&gt;在职业生涯中，我主要专注于[你的主要技术方向，如Web应用开发、跨平台开发、前端性能优化等]。我熟练掌握Vue.js（或React）框架及其生态系统，包括状态管理（Vuex/Pinia或Redux/MobX）、路由管理（Vue Router或React Router）和构建工具（Webpack/Vite）。同时，我对Node.js也有一定了解，能够进行一些基础的后端协作或独立开发前端工具。&lt;/p&gt;
&lt;p&gt;在[公司名称]，我参与了[项目名称，可以是核心项目或最有代表性的项目]的开发工作。这个项目是一个[简单描述项目类型，如中后台管理系统、电商平台、数据可视化平台]。我在其中主要负责[具体职责，如负责XX模块的开发、实现YY功能、进行ZZ性能优化]等。&lt;/p&gt;
&lt;p&gt;举个例子，在[具体项目或模块]中，我们遇到了[一个具体的技术挑战，如首屏加载慢、组件复用性差、跨端适配问题]。为了解决这个问题，我当时[你采取的具体措施和方案，如引入了Webpack的SplitChunksPlugin进行代码分割、设计了通用组件库并结合Slots/Props实现高复用、使用了Uni-App的条件编译处理平台差异]。最终，[达到的效果和数据，如首屏加载时间从5s优化到1s、组件复用率提升了30%、成功支持了微信和支付宝小程序]。这次经历让我深刻理解了[你的收获和思考，如前端性能优化的重要性、组件化设计的价值、跨平台开发的权衡点]。&lt;/p&gt;
&lt;p&gt;我不仅关注代码实现，也注重项目的整体质量和用户体验，善于发现问题并积极寻求解决方案。我也乐于学习和探索新技术，保持对前端前沿的关注。谢谢。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-5415ff84e537"&gt;2. 项目中遇到的性能优化挑战是什么？具体如何解决的？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;说明&lt;/strong&gt;：该题是典型的主观型问题，没有唯一的标准答案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;考察目标&lt;/strong&gt;：面试官主要考察答题者在实际项目中发现、分析和解决性能问题的能力，包括对性能指标的理解、优化策略的掌握以及实际操作经验和复盘能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;答题结构建议&lt;/strong&gt;：建议按照&amp;quot;背景/挑战 -&amp;gt; 如何分析 -&amp;gt; 具体优化措施 -&amp;gt; 优化效果与思考&amp;quot;的结构展开，突出解决问题的思路和细节。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在[你的项目名称，如电商H5页面/管理后台]项目中，我们曾面临一个比较明显的性能挑战，主要体现在**[具体场景，如首页首屏加载时间过长，达到了5秒以上；或者某个复杂列表页在滚动时出现卡顿]**。这严重影响了用户体验，尤其是在移动网络环境下，导致用户跳出率较高。&lt;/p&gt;
&lt;p&gt;为了定位问题，我们首先借助了&lt;strong&gt;Chrome DevTools (Lighthouse、Performance面板)&lt;/strong&gt; 进行分析。通过对加载瀑布流、CPU使用率和内存占用进行观察，我们发现主要瓶颈在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[具体瓶颈1，如：主JS包体积过大，导致解析和执行时间长]&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[具体瓶颈2，如：图片资源未优化，大量高清大图直接加载，占用带宽]&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[具体瓶颈3，如：复杂组件渲染耗时，导致回流重绘频繁，引起卡顿]&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;针对这些问题，我们采取了以下具体的优化措施：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;代码分割与按需加载&lt;/strong&gt;：针对主JS包体积过大的问题，我们引入了&lt;strong&gt;Webpack的&lt;code&gt;SplitChunksPlugin&lt;/code&gt;&lt;/strong&gt;，结合&lt;strong&gt;路由懒加载&lt;/strong&gt;（或组件懒加载）。将不同路由页面的代码和不常用的第三方库进行拆分，例如：&lt;code&gt;component: () =&amp;gt; import('./views/OrderDetail.vue')&lt;/code&gt;。这样，用户首次访问时只需要加载当前页面的核心代码，显著减少了首屏JS的下载和解析量。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;图片优化&lt;/strong&gt;：对于图片资源，我们采取了多项措施：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;图片压缩&lt;/strong&gt;：对项目中的所有图片资源进行了统一的无损压缩处理，并推荐设计师使用WebP格式的图片。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;懒加载&lt;/strong&gt;：对于首屏之外的图片，我们实现了&lt;strong&gt;图片懒加载&lt;/strong&gt;，只有当图片进入用户视口时才进行加载，避免了不必要的资源请求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CDN加速&lt;/strong&gt;：将静态图片资源部署到CDN，利用CDN的边缘节点分发，减少了网络延迟。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;组件渲染优化&lt;/strong&gt;：针对复杂组件的卡顿问题，我们做了以下工作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;虚拟列表/长列表优化&lt;/strong&gt;：对于数据量大的列表页，我们引入了&lt;strong&gt;虚拟列表&lt;/strong&gt;技术，只渲染可视区域内的DOM节点，减少了DOM数量，大幅提升了滚动流畅度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;避免不必要的渲染&lt;/strong&gt;：在Vue/React组件中，合理使用&lt;code&gt;v-if/v-show&lt;/code&gt;、&lt;code&gt;keep-alive&lt;/code&gt;、&lt;code&gt;React.memo&lt;/code&gt;/&lt;code&gt;PureComponent&lt;/code&gt;等，结合&lt;code&gt;shouldComponentUpdate&lt;/code&gt;（React）或计算属性/监听器（Vue）来避免组件的重复渲染。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;减少回流重绘&lt;/strong&gt;：优化了DOM操作，减少了频繁读写布局属性，例如将多个样式修改合并为一次操作，或者使用CSS的&lt;code&gt;transform&lt;/code&gt;代替&lt;code&gt;left/top&lt;/code&gt;进行动画。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;经过这些优化，我们的**[项目名称]首页首屏加载时间成功从5秒降低到了2秒以内**（或更具体的数据），用户反馈页面的流畅度也有了显著提升，这对业务转化率带来了积极影响。这次优化经历让我对前端性能优化有了更系统和深入的理解，也认识到性能优化是一个持续的过程，需要贯穿于项目的整个生命周期中。我们会定期进行性能监控和分析，确保用户体验。谢谢。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-40e693893a81"&gt;3. 如果让你主导一个跨平台电商项目，如何选择技术栈？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;技术栈选型能力&lt;/strong&gt;：面试官想考察候选人是否具备从宏观层面规划项目技术栈的能力，包括对主流前端框架、跨平台技术以及相关生态的了解。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对跨平台开发的深入理解&lt;/strong&gt;：考察候选人是否清楚跨平台开发的核心痛点（如性能、体验、API兼容性），并能提出针对性的解决方案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统设计和权衡能力&lt;/strong&gt;：评估候选人能否在性能、开发效率、维护成本、团队能力、业务需求等多个维度之间进行权衡和取舍。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对电商领域特点的认知&lt;/strong&gt;：了解候选人是否对电商项目特有的需求（如商品展示、购物车、支付、大促活动）有前瞻性思考，并能在技术选型中体现。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;跨平台电商项目&lt;/strong&gt;通常是指一个产品需要同时在Web（H5）、微信小程序、支付宝小程序、App（iOS/Android）等多个终端运行，并且希望尽可能复用代码，降低开发和维护成本。技术栈选择是一个复杂的决策过程，需要综合考虑项目的&lt;strong&gt;业务需求、性能要求、开发效率、团队技术栈、维护成本以及社区生态&lt;/strong&gt;等多方面因素。&lt;/p&gt;</description></item><item><title>滴滴-社招-2年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-57/round-89/</link><pubDate>Mon, 28 Jul 2025 02:20:14 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-57/round-89/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-57/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-57/round-90/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 生命周期、Vue3 API、响应式原理、v-for、事件循环&lt;/p&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-2245b14e802d"&gt;1. 为什么使用 &lt;header&gt; 而非 &lt;div class="header"&gt;&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;是HTML5语义化标签，明确头部区域含义&lt;br&gt;&lt;/li&gt;
&lt;li&gt;语义化标签有助于SEO和辅助技术识别&lt;br&gt;&lt;/li&gt;
&lt;li&gt;提高代码可读性和维护性，减少依赖类名赋予语义&lt;br&gt;&lt;/li&gt;
&lt;li&gt;推荐优先使用语义标签代替无语义的&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;+类名组合&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;理解HTML语义化标签的重要性及作用&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握语义化标签对SEO和无障碍的影响&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解语义化标签在开发协作和维护中的优势&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一语义化标签的核心概念"&gt;一、语义化标签的核心概念&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;HTML5引入了如 &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt; 等语义化标签，明确表达页面结构和内容含义&lt;br&gt;&lt;/li&gt;
&lt;li&gt;语义化标签比普通 &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; 搭配类名更具意义，利于浏览器、搜索引擎、辅助设备等理解页面&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="二使用-header-的优势"&gt;二、使用 &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt; 的优势&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;明确语义&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;表示页面或区块的头部区域，包含标题、导航等信息&lt;br&gt;&lt;/li&gt;
&lt;li&gt;比 &lt;code&gt;&amp;lt;div class=&amp;quot;header&amp;quot;&amp;gt;&lt;/code&gt; 直接通过类名赋予语义更标准、易识别&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提升可访问性&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;语义化标签被屏幕阅读器等辅助技术识别，帮助视障用户理解页面结构&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;使辅助设备快速定位页眉内容，提升用户体验&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SEO友好&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜索引擎利用语义标签准确抓取页面结构和重点内容&lt;br&gt;&lt;/li&gt;
&lt;li&gt;语义标签利于内容分类和权重判断，可能提高搜索排名&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;代码规范与维护&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;语义化标签增强代码自解释性，方便团队协作和代码维护&lt;br&gt;&lt;/li&gt;
&lt;li&gt;减少对类名、ID等非结构性属性的依赖，代码更简洁清晰&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="三使用场景对比"&gt;三、使用场景对比&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;适合定义页面或区块的头部区域&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;header&amp;quot;&amp;gt;&lt;/code&gt;仅作为普通容器，没有内置语义&lt;br&gt;&lt;/li&gt;
&lt;li&gt;两者均可通过CSS样式控制外观，但语义化标签具备结构语义&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-247f9e07b586"&gt;2. SEO和可访问性有何影响&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;语义化标签提升SEO抓取效率和内容权重分配&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结构化页面内容，增强搜索引擎对重点信息的识别能力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;语义标签是辅助技术识别页面结构的关键，提升可访问性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;有助于残障用户快速导航和理解页面&lt;br&gt;&lt;/li&gt;
&lt;li&gt;符合无障碍标准，降低法律和合规风险&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点-1"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;理解SEO（搜索引擎优化）对网页结构和内容的重要性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握语义化标签对搜索引擎抓取的正面影响&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解可访问性（Accessibility）概念及辅助技术如何利用语义标签&lt;br&gt;&lt;/li&gt;
&lt;li&gt;能说明如何通过结构优化提升用户体验及业务价值&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案-1"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一seo影响"&gt;一、SEO影响&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;语义化标签助力搜索引擎理解页面结构&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;</description></item><item><title>滴滴-社招-1年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/round-86/</link><pubDate>Mon, 28 Jul 2025 01:45:16 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/round-86/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/round-87/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 响应式原理、Webpack与Vite、https、浏览器渲染过程、浏览器的缓存机制&lt;/p&gt;
&lt;p&gt;本轮共 19 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-1760562f8190"&gt;1. 介绍一下简历中的组件库项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-dc78e2f9-568a-445d-988c-594092179848"&gt;2. 聊聊 vite 和 webpack 的区别&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/dc78e2f9-568a-445d-988c-594092179848"&gt;聊聊 vite 和 webpack 的区别&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Webpack&lt;/strong&gt;：成熟的模块打包工具，功能强大但配置复杂，适合需要高度定制和复杂构建需求的项目。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vite&lt;/strong&gt;：现代化的开发工具，提供快速的开发体验和优化的生产构建，适合追求开发效率和现代化特性的项目。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;选择 Vite 还是 Webpack 取决于项目的需求和开发团队的偏好。如果重点是开发体验和快速反馈，Vite 是一个很好的选择。如果需要高度定制化和广泛的插件支持，Webpack 可能更适合。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Vite 和 Webpack 都是前端打包工具，它们的作用类似，但实现方式和使用方法有所不同。以下是它们之间的一些区别：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;构建速度&lt;/strong&gt;：Vite 的构建速度比 Webpack 更快，因为 Vite 在开发环境下使用了浏览器原生的 ES 模块加载，而不是像 Webpack 一样使用打包后的文件进行模块加载。在 Vite 中，每个模块都可以独立地进行编译和缓存，这意味着它只需要重新编译修改过的模块，而不是整个应用程序。这使得 Vite 开发起来更加高效。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;配置复杂度&lt;/strong&gt;：Vite 的配置相对更简单，因为它无需进行大量的配置，只需指定一些基本的选项就可以开始开发。Webpack 的配置更加复杂，需要针对具体项目进行不同的配置，且需要理解各种插件、Loader 等概念。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;生态环境&lt;/strong&gt;：Webpack 的生态环境更加成熟，在社区中拥有广泛的支持和丰富的插件库。而 Vite 尚处于发展阶段，尽管其已经获得了很多关注，但其生态系统仍然不太完善。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;功能特性&lt;/strong&gt;：Webpack 是一个功能更加全面的打包工具，支持各种 Loader 和插件，可以处理多种类型的文件和资源。而 Vite 的设计初衷是专注于开发环境下的快速构建，因此其对一些高级特性的支持相对较少。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;综上所述，Vite 更适合用于开发环境下的快速构建，而 Webpack 则更适合用于生产环境下的复杂应用程序的打包处理。选择使用哪种工具需要根据具体项目需求进行评估。&lt;/p&gt;</description></item><item><title>字节-社招-6年（3-1） · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-80/</link><pubDate>Sun, 27 Jul 2025 12:05:14 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-80/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-81/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; react 渲染机制、react hooks、Webpack与Vite&lt;/p&gt;
&lt;p&gt;本轮共 15 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-c5bbf116f24b"&gt;1. 请选择一个最有技术挑战的项目，说明你解决的核心问题、技术选型依据及后续优化空间&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;STAR法则&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;根据自己项目经历，提前挖掘亮点、准备项目&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-a46093da7a90"&gt;2. 作为前端负责人，在前端基础设施层做了哪些体系化建设&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;从规范、工具链、组件库、监控和协作多维度展开&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合具体措施与实际效果进行阐述&lt;br&gt;&lt;/li&gt;
&lt;li&gt;展现管理、技术与团队文化的融合能力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;体现对挑战的预判和解决方案&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-考察候选人对前端基础设施的整体认知和架构设计能力"&gt;● 考察候选人对前端基础设施的整体认知和架构设计能力&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-了解候选人在团队管理与技术规范制定上的实践经验"&gt;● 了解候选人在团队管理与技术规范制定上的实践经验&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-关注候选人如何通过基础设施提升团队开发效率和产品质量"&gt;● 关注候选人如何通过基础设施提升团队开发效率和产品质量&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-体现对可维护性可扩展性和技术创新的把控"&gt;● 体现对可维护性、可扩展性和技术创新的把控&lt;br&gt;&lt;/h4&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一前端基础设施体系化建设的核心内容"&gt;一、前端基础设施体系化建设的核心内容&lt;/h3&gt;
&lt;h4 id="1-统一的技术规范与编码标准"&gt;1. 统一的技术规范与编码标准&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;制定并推广团队统一的代码规范（如 ESLint、Prettier 规则）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;统一命名、目录结构、组件设计规范，确保代码可读性和维护性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;定期组织代码评审，强化规范执行和技术交流&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-构建和自动化工具链搭建"&gt;2. 构建和自动化工具链搭建&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;设计统一的构建流程，选用并维护基于 Webpack、Vite 等的构建工具&lt;br&gt;&lt;/li&gt;
&lt;li&gt;实现自动化构建、测试、打包、发布流程（CI/CD）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;集成自动化测试框架（单元测试、集成测试、端到端测试）&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-组件库与设计系统建设"&gt;3. 组件库与设计系统建设&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;搭建和维护通用组件库，提升复用率与一致性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合设计系统规范，确保视觉与交互体验统一&lt;br&gt;&lt;/li&gt;
&lt;li&gt;推动组件库文档化、版本管理和持续迭代&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-性能监控与质量保障体系"&gt;4. 性能监控与质量保障体系&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;建立前端性能监控（如首屏时间、资源加载、交互响应）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;引入错误收集与上报系统，实现线上问题快速定位&lt;br&gt;&lt;/li&gt;
&lt;li&gt;建立质量门禁（代码覆盖率、性能阈值、代码扫描）&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-多端统一与跨团队协作支持"&gt;5. 多端统一与跨团队协作支持&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;设计跨平台技术方案（Web、移动端、小程序）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;制定接口规范和Mock数据方案，保障前后端高效协作&lt;br&gt;&lt;/li&gt;
&lt;li&gt;推动微前端或模块化方案，支持多团队并行开发&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="二实施效果与价值体现"&gt;二、实施效果与价值体现&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;提升团队开发效率，减少重复工作和沟通成本&lt;br&gt;&lt;/li&gt;
&lt;li&gt;保证代码质量和产品稳定性，降低线上故障率&lt;br&gt;&lt;/li&gt;
&lt;li&gt;加速产品交付，缩短上线周期&lt;br&gt;&lt;/li&gt;
&lt;li&gt;促进团队技术能力成长，构建良好技术文化&lt;br&gt;&lt;/li&gt;
&lt;li&gt;支持业务快速扩展，适应多端多业务场景需求&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="三可能遇到的挑战与应对策略"&gt;三、可能遇到的挑战与应对策略&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;团队接受度和习惯调整&lt;/strong&gt;：通过培训、逐步推行和示范项目降低阻力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具链维护复杂性&lt;/strong&gt;：设立专人负责基础设施维护和升级，保障稳定性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组件库与设计系统演进的平衡&lt;/strong&gt;：定期收集反馈，兼顾灵活性与规范性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能与稳定性监控数据的解读和应用&lt;/strong&gt;：建立专门分析流程，结合业务需求制定优化方案&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="四总结观点"&gt;四、总结观点&lt;/h3&gt;
&lt;p&gt;作为前端负责人，基础设施层的体系化建设是提升团队整体效率和产品质量的关键。通过规范标准、自动化工具、组件库、监控体系及跨团队协作支持，构建稳定且高效的前端研发环境，为业务快速发展提供坚实技术保障。同时，注重团队文化和技术传承，推动持续改进和创新。&lt;/p&gt;</description></item><item><title>字节-抖音短视频-社招-5年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-76/</link><pubDate>Sun, 27 Jul 2025 09:47:52 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-76/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-77/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 事件循环、前端存储、React 生命周期、列表和key、react 事件机制、react 渲染机制、浏览器的同源策略、CSRF攻击、 XSS防御、跨域资源共享（CORS）&lt;/p&gt;
&lt;p&gt;本轮共 23 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-cdb6497278f2"&gt;1. 介绍一下你觉的比较有成就感的项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;STAR法则&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;老传统了，基于简历挖掘一个最有亮点的项目&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-24e14e9a845e"&gt;2. 遇到的最有挑战的技术是什么&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-9e1a5a47930c"&gt;3. 项目技术选型是如何衡量的&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;列举技术选型的核心衡量标准&lt;br&gt;&lt;/li&gt;
&lt;li&gt;说明评估流程和实操方法&lt;br&gt;&lt;/li&gt;
&lt;li&gt;强调综合权衡，避免片面判断&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合项目需求和团队实际展开&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解技术选型的核心因素及其权衡原则"&gt;● 理解技术选型的核心因素及其权衡原则&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察对项目需求、团队能力与技术趋势的综合分析能力。&lt;/p&gt;
&lt;h4 id="-掌握技术选型中性能开发效率维护性等多维度考虑"&gt;● 掌握技术选型中性能、开发效率、维护性等多维度考虑&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察系统架构设计和项目管理思维。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一技术选型的衡量维度"&gt;一、技术选型的衡量维度&lt;/h3&gt;
&lt;h4 id="1-业务需求匹配度"&gt;1. 业务需求匹配度&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;技术是否满足项目的功能需求、性能要求和扩展性。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;是否支持项目特有的场景或复杂逻辑。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-团队技术栈和能力"&gt;2. 团队技术栈和能力&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;团队是否熟悉该技术，学习成本及培训投入。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;技术社区活跃度，文档完善程度，易用性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-性能表现"&gt;3. 性能表现&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;技术的响应速度、负载能力、资源消耗。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;是否支持性能优化方案（如 SSR、缓存策略等）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-生态和兼容性"&gt;4. 生态和兼容性&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;技术生态是否丰富，有无成熟的第三方库和工具支持。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;与现有系统和平台的兼容性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-维护成本与长期可持续性"&gt;5. 维护成本与长期可持续性&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;技术的稳定性和升级频率。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;社区支持和企业采用情况，避免技术孤岛。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-开发效率"&gt;6. 开发效率&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;开发周期和上线速度。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;工具链和开发体验是否高效。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="7-安全性和合规性"&gt;7. 安全性和合规性&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;技术在安全防护、隐私保护方面的能力。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;是否满足行业合规标准。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="二技术选型的评估流程"&gt;二、技术选型的评估流程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;需求调研&lt;/strong&gt;：明确项目功能和非功能需求。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方案调研&lt;/strong&gt;：收集备选技术方案及案例。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术预研和验证&lt;/strong&gt;：通过小型原型测试技术可行性。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;成本评估&lt;/strong&gt;：综合考量开发、维护、培训等成本。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;风险分析&lt;/strong&gt;：识别潜在风险，如社区活跃度、技术稳定性。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;决策和方案确定&lt;/strong&gt;：结合以上评估，选择最优技术方案。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="三总结"&gt;三、总结&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;技术选型是一个多维度权衡过程，既要满足业务需求，也需考虑团队与生态。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;注重长期维护和性能表现，避免盲目追新或仅凭个人偏好。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;通过科学的评估流程和数据支撑，做出理性选择。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-b5f3a19aa953"&gt;4. 项目中的性能监控和错误上报讲一下&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;列举关键性能指标及监控方法&lt;br&gt;&lt;/li&gt;
&lt;li&gt;说明错误类型、捕获机制和上报流程&lt;br&gt;&lt;/li&gt;
&lt;li&gt;强调数据分析与持续优化的重要性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合实际项目实践进行阐述&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点-1"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解前端性能监控的关键指标和监控手段"&gt;● 理解前端性能监控的关键指标和监控手段&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察对用户体验优化和实时监控的认知。&lt;/p&gt;</description></item><item><title>字节-商业化-社招-4年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-74/</link><pubDate>Sun, 27 Jul 2025 09:13:11 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-74/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-75/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 全方位解读this、作用域链与闭包、事件循环、call、apply和bind、前端存储、react hooks、react 渲染机制、React函数组件更新&lt;/p&gt;
&lt;p&gt;本轮共 25 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-6827d12cb118"&gt;1. 讲一下你平常使用的React Hooks&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;熟练掌握常用 Hook（useState/useEffect/useRef/useMemo/useCallback/useContext）&lt;/li&gt;
&lt;li&gt;能结合实际项目说明每个 Hook 的使用动机和实现效果&lt;/li&gt;
&lt;li&gt;理解 Hook 的核心机制（闭包陷阱、依赖数组规则、执行时机等）&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解-react-hooks-的基本使用场景及原理"&gt;● 理解 React Hooks 的基本使用场景及原理&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;面试官关注候选人是否掌握了常用 Hook 的使用规范与时机。&lt;/p&gt;
&lt;h4 id="-能否结合项目实际表达-hooks-的应用能力"&gt;● 能否结合项目实际表达 Hooks 的应用能力&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察是否具备将 React 函数组件与 Hooks 结合的实际经验与思维能力。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一常用-react-hooks-介绍"&gt;一、常用 React Hooks 介绍&lt;/h3&gt;
&lt;h4 id="1-usestate--管理组件内部状态"&gt;1. &lt;code&gt;useState&lt;/code&gt; —— 管理组件内部状态&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;：定义响应式的本地状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;典型使用场景&lt;/strong&gt;：表单输入值、按钮开关、局部 UI 状态等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; [&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;setCount&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;useState&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h4 id="2-useeffect--副作用逻辑处理"&gt;2. &lt;code&gt;useEffect&lt;/code&gt; —— 副作用逻辑处理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：用于处理副作用逻辑，如数据请求、DOM 操作、订阅事件等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;依赖数组决定副作用执行时机&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;常见场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;页面初始化请求数据（空依赖数组）&lt;/li&gt;
&lt;li&gt;监听某个状态变化触发逻辑（依赖项更新）&lt;/li&gt;
&lt;li&gt;组件卸载时清理订阅（返回 cleanup 函数）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;useEffect&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setInterval&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;tick&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; () =&amp;gt; &lt;span style="color:#a6e22e"&gt;clearInterval&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}, []);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h4 id="3-useref--获取-dom-或存储跨渲染变量"&gt;3. &lt;code&gt;useRef&lt;/code&gt; —— 获取 DOM 或存储跨渲染变量&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：可以持久保存可变值而不触发组件重新渲染；或获取 DOM 元素引用。&lt;/p&gt;</description></item><item><title>字节-社招-1年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-51/round-73/</link><pubDate>Fri, 25 Jul 2025 08:13:19 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-51/round-73/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-51/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 事件冒泡、事件捕获、事件委托、浏览器的缓存机制、组件通信、异步组件&lt;/p&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-0fc964866a11"&gt;1. 实现数组里的拍平 数组本身的拍平&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;递归遍历数组并合并结果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;判断元素类型是否为数组。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;结合ES6 flat方法提升效率。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解递归与数组操作"&gt;● 理解递归与数组操作&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察候选人对递归处理嵌套数据结构的能力。&lt;/p&gt;
&lt;h4 id="-掌握es6及新特性如flat"&gt;● 掌握ES6及新特性（如flat）&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;能结合不同方案解决扁平化问题。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 递归实现数组拍平
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @param {Array} arr - 待拍平数组，可能嵌套多层
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @returns {Array} - 扁平后的数组
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;flatten&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;item&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (Array.&lt;span style="color:#a6e22e"&gt;isArray&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;concat&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;flatten&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者使用ES6内置方法（只拍平一层）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;flatOnce&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;flat&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ES2019+ 支持深度拍平：&lt;/p&gt;</description></item><item><title>腾讯-CDG-暑期实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-50/round-72/</link><pubDate>Fri, 25 Jul 2025 07:46:26 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-50/round-72/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-50/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 22 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-cd4f699b78ff"&gt;1. 编写一个函数解析URL，提取其中的协议、域名、路径和查询参数&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;URL 结构 / URL API 使用 / 查询参数处理 / 错误处理&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解-url-结构及其组成部分"&gt;● 理解 URL 结构及其组成部分&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;面试官关注候选人是否熟悉 URL 的协议（scheme）、域名（host）、路径（path）、查询参数（query）等基本组成。&lt;/p&gt;
&lt;h4 id="-掌握字符串处理和正则表达式技巧"&gt;● 掌握字符串处理和正则表达式技巧&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;是否能用合适的方法提取各部分信息。&lt;/p&gt;
&lt;h4 id="-能写出健壮且兼容性好的解析函数"&gt;● 能写出健壮且兼容性好的解析函数&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考虑边界条件和异常输入。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="原理说明"&gt;原理说明&lt;/h4&gt;
&lt;p&gt;URL 由以下几部分构成（简化版）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;协议://域名\[:端口]/路径\[?查询参数]\[#锚点]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;协议（scheme）&lt;/strong&gt;：如 &lt;code&gt;http&lt;/code&gt;、&lt;code&gt;https&lt;/code&gt;、&lt;code&gt;ftp&lt;/code&gt; 等；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;域名（host）&lt;/strong&gt;：主机名或 IP 地址；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;路径（path）&lt;/strong&gt;：服务器资源路径；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查询参数（query）&lt;/strong&gt;：&lt;code&gt;key=value&lt;/code&gt; 形式，多个参数用 &lt;code&gt;&amp;amp;&lt;/code&gt; 分隔。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;解析时重点提取协议、域名、路径和查询参数。&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="核心代码示例javascript"&gt;核心代码示例（JavaScript）&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;parseURL&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;urlObj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;URL&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 提取协议，去掉末尾冒号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;protocol&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;urlObj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;protocol&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;replace&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 域名（包含端口，如果有）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;host&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;urlObj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;host&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;urlObj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;pathname&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 查询参数转成对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;queryParams&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;urlObj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;searchParams&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;queryParams&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;protocol&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;host&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;queryParams&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Error(&lt;span style="color:#e6db74"&gt;&amp;#39;Invalid URL&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="使用示例"&gt;使用示例&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;url&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://www.example.com:8080/path/to/page?name=alice&amp;amp;age=25&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;parseURL&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; protocol: &amp;#34;https&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; host: &amp;#34;www.example.com:8080&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; path: &amp;#34;/path/to/page&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; queryParams: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; name: &amp;#34;alice&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; age: &amp;#34;25&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h4 id="常见误区或面试陷阱"&gt;常见误区或面试陷阱&lt;/h4&gt;
&lt;h5 id="误区一使用正则解析复杂-url"&gt;误区一：使用正则解析复杂 URL&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;正则难以覆盖各种边界情况，不建议复杂场景使用；&lt;/li&gt;
&lt;li&gt;推荐使用浏览器内置的 &lt;code&gt;URL&lt;/code&gt; 类。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="误区二忽略端口号"&gt;误区二：忽略端口号&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;域名部分可能包含端口，直接取 &lt;code&gt;hostname&lt;/code&gt; 会缺失端口。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="误区三查询参数未统一处理"&gt;误区三：查询参数未统一处理&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;查询参数可能重复，需根据需求选择保存方式（这里简单取最后一个值）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="总结回顾"&gt;总结回顾&lt;/h3&gt;
&lt;p&gt;解析 URL 推荐使用原生 &lt;code&gt;URL&lt;/code&gt; API，简洁且兼容性好。重点提取协议、域名（含端口）、路径和查询参数，并把查询参数转换为对象方便后续使用。&lt;/p&gt;</description></item><item><title>腾讯-音乐 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-49/round-70/</link><pubDate>Fri, 25 Jul 2025 07:17:59 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-49/round-70/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-49/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-49/round-71/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 动画、响应式设计、事件循环、跨域、浏览器的缓存机制、列表和key、生命周期&lt;/p&gt;
&lt;p&gt;本轮共 16 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-e6ed37c33d4d"&gt;1. 请介绍一下你的科研项目经历。&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;STAR法则&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;结合自身经历展开&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-d857524704a9"&gt;2. 为什么选择前端开发作为你的职业方向？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-4c8c7e9b248f"&gt;3. 你学习前端开发有多久了？谈谈你的学习经历。&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-5be066a0fa02"&gt;4. 如何使用CSS实现动画效果？举个项目中的例子。&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;transition/animation 区别 / transform+opacity / 项目落地举例 / 动画性能&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-css-动画相关属性与原理掌握"&gt;● CSS 动画相关属性与原理掌握&lt;/h4&gt;
&lt;p&gt;面试官希望了解候选人是否掌握 CSS 动画的基本实现方式，包括 &lt;code&gt;transition&lt;/code&gt;、&lt;code&gt;animation&lt;/code&gt;、关键帧、补间函数等。&lt;/p&gt;
&lt;h4 id="-能结合项目场景举例说明"&gt;● 能结合项目场景举例说明&lt;/h4&gt;
&lt;p&gt;不仅要懂 API，更重要的是知道什么时候使用、为什么使用，是否有性能考量和交互体验意识。&lt;/p&gt;
&lt;h4 id="-对动画效果的性能与体验理解"&gt;● 对动画效果的性能与体验理解&lt;/h4&gt;
&lt;p&gt;是否清楚哪些动画对性能影响大，哪些动画适合用 CSS 实现，如何避免卡顿或丢帧。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="原理说明"&gt;原理说明&lt;/h4&gt;
&lt;h5 id="一css-动画的实现方式"&gt;一、CSS 动画的实现方式&lt;/h5&gt;
&lt;p&gt;CSS 提供了两类动画机制：&lt;/p&gt;
&lt;h6 id="1-过渡动画transition"&gt;1. 过渡动画（transition）&lt;/h6&gt;
&lt;p&gt;通过 &lt;code&gt;transition&lt;/code&gt; 属性定义在样式变更时自动补间的动画：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;button&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;transition&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;all&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.3&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ease-in-out&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;特点：&lt;/p&gt;</description></item><item><title>腾讯云-实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-48/round-68/</link><pubDate>Fri, 25 Jul 2025 02:54:17 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-48/round-68/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-48/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-48/round-69/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 一面，更多考察的是八股文的基础知识&lt;/p&gt;
&lt;p&gt;本轮共 20 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-a75b1e9d-9359-47b0-8614-1088eee4b085"&gt;1. 什么是 HTML 语义化？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/a75b1e9d-9359-47b0-8614-1088eee4b085"&gt;什么是 HTML 语义化？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;先看下什么是HTML：&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;先看下什么是HTML：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;超文本标记语言（英语：HyperText Markup Language，简称：HTML）是一种用于创建网页的标准标记语言。
HTML元素是构建网站的基石。HTML允许嵌入图像与对象，并且可以用于创建交互式表单，它被用来结构化信息——例如标题、段落和列表等等，也可用来在一定程度上描述文档的外观和语义。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;那么如何理解 Web 语义化？&lt;/p&gt;
&lt;p&gt;通俗的来讲就是从代码上来展示页面的结构，而不是从最终视觉上来展示结构。&lt;/p&gt;
&lt;p&gt;单纯的HTML代码是不带任何样式的只是用来标记这一段是标题、这一块是代码、那一个是要强调的内容等等。&lt;/p&gt;
&lt;p&gt;但是为什么我们只写HTML在浏览器中不同的标签也是有不同的样式呢？&lt;/p&gt;
&lt;p&gt;那是因为各个浏览器都自带的有相应标签的默认样式，为了方便在没有设定样式的情况下友好的展示页面。&lt;/p&gt;
&lt;p&gt;良好的语义化代码可以直接从代码上就能看出来那一块到底是要表达什么内容。&lt;/p&gt;
&lt;h2 id="为什么要使用语义化标签"&gt;为什么要使用语义化标签？&lt;/h2&gt;
&lt;p&gt;有伙伴会认为，我用DIV+CSS也能做出来一样的效果，虽然单纯看实现效果，两者并没有什么区别。&lt;/p&gt;
&lt;p&gt;但是页面不止是给人看的，机器也要看爬虫也要看，网页结构更清晰方便开发维护。&lt;/p&gt;
&lt;p&gt;特别是在网络或其他原因页面样式文件丢失的时候，良好语义结构组成的页面，肯定比全是div的页面对用户更友好。&lt;/p&gt;
&lt;p&gt;总结下语义化的优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标签语义化有助于构架良好的HTML结构，有利于搜索引擎的建立索引、抓取。简单来说。&lt;/li&gt;
&lt;li&gt;有利于不同设备的解析（屏幕阅读器，盲人阅读器等）&lt;/li&gt;
&lt;li&gt;有利于构建清晰的机构，有利于团队的开发、维护&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-c66a747cbe22"&gt;2. CSS盒模型、Flex布局与Grid布局的区别及适用场景&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS盒模型/box-sizing/Flex布局/Grid布局/一维 vs 二维/布局适用场景/页面结构设计&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h4 id="一考察点"&gt;一、考察点&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;是否掌握 CSS 中盒模型的基本概念及布局行为&lt;/li&gt;
&lt;li&gt;Flex 与 Grid 的本质区别及使用场景是否清晰&lt;/li&gt;
&lt;li&gt;能否结合实际 UI 场景选择最合适的布局方式&lt;/li&gt;
&lt;li&gt;是否理解布局系统与页面结构解耦的设计思想&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="二参考答案"&gt;二、参考答案&lt;/h4&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;hr&gt;
&lt;h3 id="-一css-盒模型box-model"&gt;✅ 一、CSS 盒模型（Box Model）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：所有 HTML 元素都可以看作一个矩形盒子，由以下四层组成：&lt;/p&gt;</description></item><item><title>百度-百度云-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/round-65/</link><pubDate>Thu, 24 Jul 2025 15:06:51 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/round-65/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/round-66/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本轮面试注重基础知识的掌握与表达，涵盖了前端语言、框架原理、计算机基础、网络协议、数据库设计、加密安全等内容，兼顾技术深度与广度。&lt;/p&gt;
&lt;p&gt;本轮共 16 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-d5f454c4c77e"&gt;1. 面向对象和面向程序设计的主要区别&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;面向过程以过程为中心，强调顺序执行逻辑，适合小型程序；&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;ul&gt;
&lt;li&gt;面向过程以过程为中心，强调顺序执行逻辑，适合小型程序；&lt;/li&gt;
&lt;li&gt;面向对象以对象和行为抽象为中心，强调封装、继承、多态，适合复杂系统的可维护性与复用性设计。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-1e59a267c882"&gt;2. 面向对象的三大特性&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;封装隐藏内部实现、继承提高复用性、多态通过统一接口实现行为差异，三者是构建大型系统的基础。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;封装隐藏内部实现、继承提高复用性、多态通过统一接口实现行为差异，三者是构建大型系统的基础。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-252664a5-1524-46f0-b6ae-ae7e2874f6e2"&gt;3. 开发的过程中你用到过哪些设计模式？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/252664a5-1524-46f0-b6ae-ae7e2874f6e2"&gt;开发的过程中你用到过哪些设计模式？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;设计模式是一种被广泛接受并经过验证的面向对象软件开发中的最佳实践。它们提供了一套解决常见问题的可重用设计方案。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;设计模式是一种被广泛接受并经过验证的面向对象软件开发中的最佳实践。它们提供了一套解决常见问题的可重用设计方案。&lt;/p&gt;
&lt;p&gt;以下是一些常用的设计模式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;单例模式（Singleton）&lt;/strong&gt;：确保一个类只有一个实例，并提供全局访问点来获取该实例。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;工厂模式（Factory）&lt;/strong&gt;：通过工厂方法创建对象，而不是直接使用&lt;code&gt;new&lt;/code&gt;操作符。这样可以隐藏具体实现，并根据需要创建所需类型的对象。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;观察者模式（Observer）&lt;/strong&gt;：定义了一种一对多的依赖关系，当一个对象状态发生改变时，它的所有依赖者（观察者）都会收到通知并自动更新。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;装饰器模式（Decorator）&lt;/strong&gt;：动态地将责任附加到对象上。通过将对象包装在装饰器对象中，可以在运行时为对象添加新的行为。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;策略模式（Strategy）&lt;/strong&gt;：定义了一系列算法，将每个算法封装起来并使它们可以相互替换。策略模式可以让算法独立于客户端而变化。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;适配器模式（Adapter）&lt;/strong&gt;：将一个类的接口转换成客户端所期望的另一个接口。适配器模式使得原本由于接口不匹配而无法一起工作的类可以协同工作。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;每个设计模式都有其特定的应用场景和优缺点，可以根据具体情况来选择使用。设计模式可以提高代码结构的灵活性、可维护性和可扩展性，并促进重用和解耦。然而，需要根据实际需求慎重选择和应用设计模式，避免过度设计或不必要的复杂性。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-6e24fdf44b3a"&gt;4. JavaScript 中引用数据类型和基本数据类型&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;基本类型包括 Number、String 等，按值传递；引用类型如 Object、Array 按地址传递，赋值为浅拷贝。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;基本类型包括 Number、String 等，按值传递；引用类型如 Object、Array 按地址传递，赋值为浅拷贝。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-da1881cc-64b9-40f8-8a25-a6256c1349ed"&gt;5. 谈谈对Vue中双向绑定的理解&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/da1881cc-64b9-40f8-8a25-a6256c1349ed"&gt;谈谈对Vue中双向绑定的理解&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Vue中的双向绑定是其核心特性之一，它极大地简化了数据在视图（View）和模型（Model）之间的同步过程。双向绑定意味着当数据发生变化时，视图会自动更新以反映这些变化，反之亦然，用户在视图上的操作（如输入）也会自动更新到数据中。&lt;/p&gt;
&lt;h4 id="实现原理"&gt;实现原理&lt;/h4&gt;
&lt;p&gt;Vue的双向绑定主要依赖于其响应式系统（Reactivity System）和模板引擎（Template Engine）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;响应式系统&lt;/strong&gt;：Vue使用Object.defineProperty（在Vue 3中使用了Proxy）来劫持（或说“代理”）对象的getter和setter。当组件的data中的属性被访问或修改时，Vue会拦截这些操作，并执行相应的依赖更新逻辑。这样，Vue就能追踪到数据的变化，并在需要时更新视图。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模板引擎&lt;/strong&gt;：Vue的模板引擎使用基于HTML的模板语法，允许开发者声明式地将DOM绑定到底层Vue实例的数据上。当数据变化时，Vue的模板引擎会重新渲染模板，生成新的虚拟DOM树，并通过高效的DOM diff算法更新真实的DOM，以反映数据的最新状态。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一什么是双向绑定"&gt;一、什么是双向绑定&lt;/h2&gt;
&lt;p&gt;我们先从单向绑定切入单向绑定非常简单，就是把&lt;code&gt;Model&lt;/code&gt;绑定到&lt;code&gt;View&lt;/code&gt;，当我们用&lt;code&gt;JavaScript&lt;/code&gt;代码更新&lt;code&gt;Model&lt;/code&gt;时，&lt;code&gt;View&lt;/code&gt;就会自动更新双向绑定就很容易联想到了，在单向绑定的基础上，用户更新了&lt;code&gt;View&lt;/code&gt;，&lt;code&gt;Model&lt;/code&gt;的数据也自动被更新了，这种情况就是双向绑定举个栗子&lt;/p&gt;</description></item><item><title>美团-优选-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-46/round-63/</link><pubDate>Tue, 22 Jul 2025 09:24:00 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-46/round-63/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-46/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-46/round-64/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础知识、项目经验以及问题解决能力。&lt;/p&gt;
&lt;p&gt;本轮共 15 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-8e1cd6867be4"&gt;1. 介绍一下你参与过的一个重要项目，包括项目背景、目标、技术栈以及你的角色和主要职责。&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;该题是主观型问题，没有唯一标准答案。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者的表达能力、思路系统性、技术理解和复盘能力。&lt;/li&gt;
&lt;li&gt;建议答题结构：首先概括项目，然后详细阐述项目背景、目标、技术栈，最后具体说明个人角色、职责与贡献。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我的一个重要项目是&amp;quot;企业级智能客服系统前端优化与重构&amp;quot;。这个项目主要目标是提升现有客服系统的用户体验和性能，解决老旧技术栈带来的开发维护效率低下问题，并支持后续功能迭代。&lt;/p&gt;
&lt;p&gt;项目背景是，公司原有的客服系统基于jQuery和少量原生JS开发，代码耦合度高，组件复用性差，加载速度慢，且难以适应移动端多渠道接入的需求。用户反馈系统卡顿、响应慢，客服人员操作效率受影响。因此，我们团队决定对前端进行一次彻底的优化与重构，旨在将其升级为一套现代化、高性能、易于扩展的Web应用。&lt;/p&gt;
&lt;p&gt;我在这个项目中担任核心前端开发，主要职责包括：参与技术选型与架构设计讨论；负责核心模块（如聊天窗口、工单管理、智能问答）的组件化开发和性能优化；协调前后端接口联调；编写单元测试和端到端测试；以及进行线上问题的快速响应和修复。在技术栈上，我们选择了React作为主框架，配合TypeScript进行类型管理，使用Redux进行状态管理，Webpack进行模块打包，并引入Ant Design作为UI组件库，以加速开发效率并保证UI一致性。&lt;/p&gt;
&lt;p&gt;具体来说，我主导了聊天模块的重构，将其从原来复杂的DOM操作和回调函数地狱，改造为基于React组件和Hooks的声明式UI。通过引入虚拟列表技术，解决了海量消息导致页面卡顿的问题，使得聊天记录即使达到上万条也能保持流畅滚动。此外，我还优化了消息发送机制，利用WebSocket实现了实时消息推送，减少了轮询开销。在性能方面，通过代码分割、图片懒加载等手段，将首屏加载时间从原来的8秒优化到2秒以内。整个重构过程不仅提升了系统的稳定性和用户满意度，也大大降低了后续功能开发的门槛和时间成本，为团队技术栈升级和业务发展奠定了坚实基础。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-36be8f8e9a6f"&gt;2. 在项目中，有没有遇到过什么技术难题？你是如何解决的？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;该题是主观型问题，没有唯一标准答案。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者的技术深度、问题解决能力、逻辑思维和学习能力。&lt;/li&gt;
&lt;li&gt;建议答题结构：首先描述一个具体的技术难题，然后阐述你分析问题、寻找解决方案的过程，最后说明解决方案的细节、效果和你的思考。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在之前负责的&amp;quot;企业级智能客服系统前端优化与重构&amp;quot;项目中，我们遇到了一个比较棘手的技术难题，就是&lt;strong&gt;前端内存占用过高导致页面卡顿和崩溃&lt;/strong&gt;的问题。&lt;/p&gt;
&lt;p&gt;这个系统有一个核心功能是聊天记录展示，用户可能会长时间使用，导致累积大量消息。最初的版本，每条消息都是一个独立的DOM节点，当消息数量达到几千甚至上万条时，DOM节点数量急剧增加，导致浏览器内存占用飙升，页面滚动变得非常卡顿，甚至在一些配置较低的设备上直接崩溃。用户反馈非常强烈，严重影响了客服人员的工作效率。&lt;/p&gt;
&lt;p&gt;为了解决这个问题，我首先进行了性能分析，通过Chrome开发者工具的Performance和Memory面板，确认了是DOM节点过多和重复渲染导致的内存泄漏和性能瓶颈。随后，我开始研究前端长列表的优化方案，主要考察了**虚拟列表（Virtual List）**技术。虚拟列表的核心思想是只渲染可视区域内的DOM元素，非可视区域的元素进行回收复用，从而大大减少DOM数量。&lt;/p&gt;
&lt;p&gt;具体实施时，我引入了一个成熟的虚拟列表库，并根据项目需求对其进行了定制化开发。首先，需要计算每个列表项的动态高度，因为消息内容可能长短不一，包含图片、表情等不同元素。我采用了一种策略：在首次渲染时估算高度，并在图片加载完成后或内容变化时动态调整。其次，我设计了&amp;quot;缓冲区域&amp;quot;，即在可视区域上下各多渲染一定数量的元素，以保证用户快速滚动时的流畅体验，避免出现白屏。最后，我优化了数据加载逻辑，当用户滚动到列表底部时，只加载下一页数据并追加到虚拟列表的数据源中，而不是重新渲染整个列表。&lt;/p&gt;
&lt;p&gt;通过实施虚拟列表，我们将聊天窗口的DOM节点数量从数万个降低到稳定在几十个到一百个之间，极大地减少了内存占用。实际测试显示，即使加载十万条消息，页面也能保持流畅滚动，响应速度显著提升。这个方案不仅解决了当前的性能痛点，也为系统后续的消息富文本支持、历史记录加载等复杂功能提供了坚实的基础，避免了未来可能出现的类似问题。整个过程中，我学到了如何深入分析前端性能瓶颈，以及如何选择和应用合适的优化技术来解决实际问题。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-2e4de664c4bc"&gt;3. 如果项目中的 token 被窃取了，你会采取哪些措施来应对？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;该题是主观型问题，没有唯一标准答案。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者对安全问题的认知、应急响应能力和系统性思考。&lt;/li&gt;
&lt;li&gt;建议答题结构：首先说明 token 被窃取的危害，然后从&amp;quot;发现-应对-预防&amp;quot;三个层面阐述具体措施，最后强调持续安全防护的重要性。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;当项目中的 token 被窃取，这无疑是一个严重的安全事件，因为它可能导致用户身份被冒用，数据泄露，甚至对系统造成进一步的破坏。我的应对措施会从紧急响应、事后恢复和长期预防三个层面展开。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;首先是紧急响应和止损。&lt;/strong&gt; 一旦发现 token 存在被窃取的风险或已确认被窃取，最核心的措施是&lt;strong&gt;立即强制所有用户的 token 失效或重置&lt;/strong&gt;。这可以通过后端来实现，比如在数据库中将相关 token 标记为无效，或者更新用户会话状态，迫使其重新登录。同时，我会立即通知受影响的用户（如果可以定位到），告知他们 token 失效并要求重新登录，并建议他们检查个人信息是否有异常。在此期间，还需要暂停或限制可疑IP地址或异常行为的访问，以阻止攻击的进一步扩散。例如，如果发现某个账号在短时间内有大量异常登录尝试或数据请求，应立即锁定该账号并通知用户。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;其次是事后恢复与溯源。&lt;/strong&gt; 在完成紧急止损后，需要立即展开详细的调查和分析，以确定 token 是如何被窃取的，攻击的范围有多大，以及是否有数据泄露或系统被篡改的证据。这包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;日志分析&lt;/strong&gt;：仔细检查服务器访问日志、应用日志和安全日志，查找异常的登录行为、API调用、IP地址或用户代理信息。重点关注 token 签发、刷新和验证的日志。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码审计&lt;/strong&gt;：对可能存在安全漏洞的代码进行审查，例如是否存在XSS漏洞导致前端窃取，或者后端存储、传输 token 的方式是否安全。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户影响评估&lt;/strong&gt;：评估有多少用户受到影响，以及可能泄露了哪些数据。根据评估结果，制定更详细的恢复计划，例如是否需要回滚某些操作，或者向受影响用户提供进一步的帮助。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;最后是长期预防措施。&lt;/strong&gt; 针对这次事件暴露出的问题，我们需要采取一系列措施来增强系统的整体安全性，防止类似事件再次发生：&lt;/p&gt;</description></item><item><title>百度-文库-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-45/round-61/</link><pubDate>Sat, 19 Jul 2025 07:40:07 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-45/round-61/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-45/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-45/round-62/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本轮面试侧重于考察候选人的JavaScript基础知识、CSS布局能力、对浏览器工作原理的理解以及实际编码能力。重点在于事件循环、异步编程、闭包、原型链等核心概念，同时也涵盖了跨域、缓存等常见Web问题。&lt;/p&gt;
&lt;p&gt;本轮共 11 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-a49bd92d13fb"&gt;1. 实现一个三栏布局，左右侧固定200px，中间自适应，写出至少两种方案。追问：Grid布局中fr单位的作用？如何解决Flex布局的浏览器兼容问题？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CSS布局能力&lt;/strong&gt;：面试官想确认你是否熟练掌握现代CSS布局技术，如Flexbox和Grid，以及是否了解传统的布局方法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;布局方案的优劣对比&lt;/strong&gt;：能否分析不同方案的适用场景和优缺点，体现出技术选型的思考能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSS单位的理解&lt;/strong&gt;：对&lt;code&gt;fr&lt;/code&gt;这类现代布局单位的深入理解，表明你不是只会“复制粘贴”代码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;兼容性处理经验&lt;/strong&gt;：在实际项目中如何处理浏览器兼容性问题，这是衡量工程师经验的重要指标。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;三栏布局是前端开发中的经典布局问题，旨在实现一个两侧宽度固定、中间区域宽度自适应的页面结构。核心是处理中间区域如何填满剩余空间。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Flexbox（弹性盒子布局）&lt;/strong&gt;：是一种一维布局模型，它让容器内的项目（item）能够灵活地分配空间。通过设置父容器&lt;code&gt;display: flex&lt;/code&gt;，并为子项设置&lt;code&gt;flex-grow&lt;/code&gt;（放大比例）、&lt;code&gt;flex-shrink&lt;/code&gt;（缩小比例）和&lt;code&gt;flex-basis&lt;/code&gt;（基准大小），可以轻松实现空间的自适应分配。对于三栏布局，可以将中间栏的&lt;code&gt;flex-grow&lt;/code&gt;设为&lt;code&gt;1&lt;/code&gt;，使其占据所有剩余空间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grid（网格布局）&lt;/strong&gt;：是一种二维布局模型，可以将页面划分为行和列，并在这些行列构成的单元格中放置内容。通过&lt;code&gt;grid-template-columns&lt;/code&gt;属性，可以精确定义每一列的宽度，使用&lt;code&gt;fr&lt;/code&gt;单位可以非常方便地实现自适应。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fr 单位&lt;/strong&gt;：&lt;code&gt;fr&lt;/code&gt;是 &amp;ldquo;fractional unit&amp;rdquo;（分数单位）的缩写，用于Grid布局中。它代表了可用空间的一等份。例如，&lt;code&gt;grid-template-columns: 200px 1fr 200px;&lt;/code&gt;意味着第一个和第三个元素宽度为&lt;code&gt;200px&lt;/code&gt;，中间的元素占据所有剩余的可用空间。如果是&lt;code&gt;1fr 2fr&lt;/code&gt;，则表示两者按1:2的比例分配可用空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="12-核心用法--示例代码"&gt;1.2 核心用法 + 示例代码&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;方案一：Flexbox 布局&lt;/strong&gt;这是目前最常用和推荐的方案，代码简洁且语义化。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;使用场景&lt;/strong&gt;：适用于绝大部分现代浏览器项目，尤其是一维方向（行或列）的布局。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意点&lt;/strong&gt;：需要注意旧版本浏览器的兼容性问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;div class=&amp;#34;container-flex&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;div class=&amp;#34;left&amp;#34;&amp;gt;左侧固定&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;div class=&amp;#34;main&amp;#34;&amp;gt;中间自适应&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;div class=&amp;#34;right&amp;#34;&amp;gt;右侧固定&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;style&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .container-flex {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; display: flex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; height: 100vh;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .left, .right {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; width: 200px;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; background-color: #f0f0f0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .main {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; flex: 1; /* 等同于 flex-grow: 1; flex-shrink: 1; flex-basis: 0%; */
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; background-color: #e0e0e0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/style&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方案二：Grid 布局&lt;/strong&gt;Grid布局在处理二维对齐时更具优势，实现三栏布局同样非常简单。&lt;/p&gt;</description></item><item><title>腾讯-视频-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-44/round-58/</link><pubDate>Thu, 17 Jul 2025 14:02:21 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-44/round-58/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-44/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; - 考点覆盖：网络协议（HTTP/HTTPS、OSI、WebSocket、QUIC、CORS）、安全（XSS、缓存投毒）、性能优化（缓存、懒加载/预加载）、工程化（版本更新、路由）、Vue框架细节。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;难易度：中等偏上。前6题基础网络必会，7-10题需理解协议差异与实战场景，11-16题偏重安全与缓存的落地策略，17-20题考察框架原理与工程思维，梯度合理但深度要求高。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-78e6f23a2378"&gt;1. 统计出现次数最多的字符以及出现的次数&lt;/h2&gt;
&lt;p&gt;题目描述：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;编写一个函数，接收一个字符串作为输入，统计并返回出现次数最多的字符及其出现的次数。如果有多个字符出现次数相同且最多，则返回所有这些字符及其出现次数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入输出要求：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;输入：一个字符串（只包含字母和数字）。&lt;/li&gt;
&lt;li&gt;输出：一个对象，包含出现次数最多的字符及其出现次数。
示例：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;input&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;aabbccddde&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mostFrequentChar&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;input&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 输出：{ a: 2, b: 2, c: 2, d: 3, e: 1 }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;时间复杂度：O(n)，需要遍历字符串两次&lt;/li&gt;
&lt;li&gt;空间复杂度：O(k)，k为不同字符的数量&lt;/li&gt;
&lt;li&gt;关键点：正确理解题意，返回所有出现次数最多的字符&lt;/li&gt;
&lt;li&gt;优化：可以在统计过程中同时记录最大值，减少遍历次数&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;这道题需要统计字符串中每个字符的出现次数，然后找出出现次数最多的字符。需要注意的是，题目要求如果有多个字符出现次数相同且最多，要返回所有这些字符。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解题思路：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;遍历字符串，使用Map或对象统计每个字符的出现次数&lt;/li&gt;
&lt;li&gt;找出最大出现次数&lt;/li&gt;
&lt;li&gt;筛选出所有达到最大出现次数的字符&lt;/li&gt;
&lt;li&gt;返回结果对象&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;代码实现：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mostFrequentChar&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 边界情况处理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 统计每个字符的出现次数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;] &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 找出最大出现次数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;maxCount&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(...Object.&lt;span style="color:#a6e22e"&gt;values&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 筛选出所有达到最大出现次数的字符
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;] &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; Object.&lt;span style="color:#a6e22e"&gt;entries&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;maxCount&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 优化版本：使用Map，一次遍历完成
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mostFrequentCharOptimized&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Map&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;maxCount&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 统计字符出现次数，同时记录最大值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;) &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;set&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;maxCount&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;maxCount&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 构建结果对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;] &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;maxCount&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;测试用例：&lt;/p&gt;</description></item><item><title>美团-酒旅-前端面经 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-43/round-57/</link><pubDate>Thu, 17 Jul 2025 08:18:40 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-43/round-57/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-43/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 13 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-6722e7a3eb1d"&gt;1. 简历提到你熟悉Git，请问如何处理代码合并时的冲突？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;面试官出这道题主要想确认哪些知识维度？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Git基础操作&lt;/strong&gt;：考察候选人对Git版本控制工具的熟悉程度，尤其是合并（merge）和解决冲突（conflict resolution）等核心操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;问题解决能力&lt;/strong&gt;：在实际开发中遇到代码冲突时，候选人如何分析问题、定位冲突并有效解决。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协作开发经验&lt;/strong&gt;：在团队协作中，如何避免冲突，以及在发生冲突后如何与其他团队成员协作解决。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;该题所考知识点中有哪些高频实际应用点？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;日常代码合并&lt;/strong&gt;：开发者在日常工作中频繁进行分支合并，冲突处理是不可避免的环节。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;版本回溯与管理&lt;/strong&gt;：理解冲突解决机制有助于更好地进行版本管理和历史回溯。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;团队协作效率&lt;/strong&gt;：高效解决冲突能够提高团队的开发效率和代码质量。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h4 id="11-原理说明"&gt;1.1 原理说明&lt;/h4&gt;
&lt;p&gt;Git冲突是指在合并（merge）或变基（rebase）分支时，不同分支对同一个文件的相同部分进行了修改，或者一个分支修改了文件而另一个分支删除了该文件，导致Git无法自动判断保留哪个修改时发生的情况。Git会暂停合并操作，并将冲突部分标记出来，等待用户手动解决。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;冲突的产生：&lt;/strong&gt;
当两个或多个开发者对同一个文件的同一行或同一区域进行修改，并将各自的修改推送到远程仓库，在合并这些修改时，Git会提示冲突。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;冲突的类型：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内容冲突&lt;/strong&gt;：最常见，发生在同一个文件的相同行或相邻行被不同分支修改。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件冲突&lt;/strong&gt;：一个分支修改了文件，另一个分支删除了该文件；或者两个分支都创建了同名文件但内容不同。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="12-核心用法--示例代码"&gt;1.2 核心用法 + 示例代码&lt;/h4&gt;
&lt;p&gt;处理Git合并冲突的主要步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;更新本地仓库&lt;/strong&gt;：在进行合并操作前，通常需要先拉取远程最新代码，确保本地分支是最新的，减少潜在冲突。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git pull origin &amp;lt;your-branch&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;执行合并操作&lt;/strong&gt;：当你尝试将一个分支合并到另一个分支时，如果存在冲突，Git会提示并停止合并。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge &amp;lt;other-branch&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者使用rebase：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rebase &amp;lt;other-branch&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;识别冲突标记&lt;/strong&gt;：Git会在冲突文件中插入特殊标记，通常是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;amp;lt; HEAD
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// 当前分支的修改
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;=======
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// 待合并分支的修改
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;lt;commit-id-or-branch-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;amp;lt; HEAD&lt;/code&gt;：表示当前分支（HEAD指向）的代码。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;=======&lt;/code&gt;：分隔符，表示冲突的开始和结束。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;lt;commit-id-or-branch-name&amp;gt;&lt;/code&gt;：表示待合并分支的代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;手动解决冲突&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;编辑冲突文件&lt;/strong&gt;：根据业务需求，手动修改冲突文件，决定保留哪些代码，删除哪些代码。你可以选择保留其中一个分支的修改，或者结合两者的修改，甚至编写全新的代码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删除冲突标记&lt;/strong&gt;：在解决冲突后，务必删除&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code&gt;、&lt;code&gt;=======&lt;/code&gt;和&lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;这些Git自动添加的标记。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;将解决后的文件标记为已解决&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add &amp;lt;conflicted-file-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提交合并结果&lt;/strong&gt;：在所有冲突文件都标记为已解决后，提交合并。&lt;/p&gt;</description></item><item><title>百度-地图-秋招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/round-55/</link><pubDate>Thu, 10 Jul 2025 14:52:42 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/round-55/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/round-59/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 基础知识面不少，进一步考察实际工程和性能优化能力&lt;/p&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-e78ee3f21e11"&gt;1. BFC的作用及触发条件，使用场景讲一下&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CSS 样式中 BFC 的概念、特性和触发条件&lt;/li&gt;
&lt;li&gt;BFC 应用场景：避免多列排版间隔折行问题、清除浮动、各区域形成隔离&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;BFC (Block Formatting Context)&lt;/strong&gt;，即块级格式化上下文。它是 W3C CSS2.1 中的一类属性，是一个独立的布局环境，在该环境里，按照特定规则进行元素排列和布局。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主要特性：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BFC 内部的元素不会和外部的元素受 margin 折行的影响&lt;/li&gt;
&lt;li&gt;BFC 可以包裹内部浮动元素，解决父容器高度不拉伸问题&lt;/li&gt;
&lt;li&gt;BFC 不会被浮动元素拉动&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;触发 BFC 的条件：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;样式中定义此元素为 float (non-none)&lt;/li&gt;
&lt;li&gt;正文模型 overflow 为 hidden, scroll, auto&lt;/li&gt;
&lt;li&gt;display 为 inline-block, table-cell, flex, grid, flow-root&lt;/li&gt;
&lt;li&gt;position 为 absolute 或 fixed&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="12-核心用法--示例代码"&gt;1.2 核心用法 + 示例代码&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;场景1：清除浮动&lt;/strong&gt; 常用 BFC 包裹元素，使父元素的高度得以支撑&lt;/p&gt;</description></item><item><title>360集团-24年-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-40/round-53/</link><pubDate>Wed, 09 Jul 2025 08:05:48 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-40/round-53/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-40/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的前端基础内容和项目经验。&lt;/p&gt;
&lt;p&gt;本轮共 20 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-8af01cadfebb"&gt;1. 前端学习路径&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;本题为主观题，没有标准答案，主要考察候选人的学习能力、知识体系构建能力以及持续学习的动力。&lt;/li&gt;
&lt;li&gt;面试官希望了解候选人获取新知识、解决问题的途径和习惯，以及对前端知识的理解是否系统、全面。&lt;/li&gt;
&lt;li&gt;建议回答结构：我的前端启蒙与基础学习阶段 → 深入学习特定框架/技术 → 通过项目实践巩固与提升 → 持续学习与关注前沿技术。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我的前端学习路径可以分为几个阶段。最初，我对互联网技术充满好奇，通过[提及学习方式，例如：慕课网上的入门课程和MDN文档]开始了前端的启蒙。在这个阶段，我扎实掌握了HTML、CSS和JavaScript这&amp;quot;三驾马车&amp;quot;的基础知识，理解了DOM操作、盒模型、BFC等核心概念。为了更好地实践，我还搭建了一些简单的静态页面和交互功能，这让我对前端有了初步的认识。&lt;/p&gt;
&lt;p&gt;随着学习的深入，我意识到框架在大型项目开发中的重要性。我选择了[提及选择的框架，例如：React作为第一个深入学习的框架]，因为它在业界应用广泛且社区活跃。我通过[提及学习方式，例如：阅读官方文档、跟随开源项目教程，以及阅读《React设计模式与最佳实践》等书籍]，系统学习了React的组件化思想、生命周期、Hooks、状态管理（如Redux或Context API）等。为了融会贯通，我模仿并实现了一些[提及实践项目，例如：电商网站的商品详情页、用户管理后台界面]，并在其中积极实践了组件复用和性能优化。&lt;/p&gt;
&lt;p&gt;在掌握React后，我又学习了Vue，主要是为了拓宽技术栈，了解不同框架的设计哲学。通过对比学习，我能更好地理解它们在数据响应式、模板语法、生态系统等方面的差异，这让我在技术选型时能有更全面的考量。项目实践是检验学习成果的最佳方式，我总是尝试将所学知识应用到实际项目中，例如[提及具体项目中的实践，例如：在一个数据可视化项目中，我负责了图表组件的封装和数据渲染优化，并解决了跨域请求等问题]，通过解决实际问题来加深理解和提升能力。&lt;/p&gt;
&lt;p&gt;此外，我始终保持持续学习的习惯。我关注前端技术社区，如GitHub Trending、掘金、知乎专栏等，定期阅读技术博客和行业报告，了解最新的前端趋势和技术发展，比如[提及关注的新技术，例如：WebAssembly、微前端、Serverless等]。我认为前端技术发展迅速，只有不断学习和实践，才能保持竞争力。当遇到新的技术挑战时，我通常会先查阅官方文档，然后搜索相关的技术文章和社区讨论，如果依然无法解决，会向有经验的同事或社区前辈请教。这个过程不仅帮助我解决了问题，也锻炼了我独立思考和解决问题的能力。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-db69e6e99255"&gt;2. 你提到对React和Vue都了解，对比两者的差异？在项目中如何选择？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;框架基础掌握：确认候选人对React和Vue两大主流前端框架的核心概念、工作原理有深入理解。&lt;/li&gt;
&lt;li&gt;异同点辨析：考察候选人能否准确对比两者在数据管理、模板语法、生态系统等方面的差异。&lt;/li&gt;
&lt;li&gt;项目选型能力：评估候选人是否具备根据项目需求、团队情况等因素，合理选择技术栈的决策能力。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;React和Vue都是目前主流的前端UI框架，用于构建用户界面。它们都采用了组件化的开发思想和虚拟DOM技术来提高开发效率和性能。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;React：&lt;/strong&gt; React是一个由Facebook开发的用于构建用户界面的JavaScript库。它强调&amp;quot;一次学习，随处编写&amp;quot;，以其声明式视图、组件化、以及单向数据流而闻名。React的核心是JSX（JavaScript XML），一种允许在JavaScript中编写类似HTML结构的语法，这使得UI的逻辑和视图紧密结合。React的更新机制是基于状态的变化，当组件状态更新时，React会创建一个新的虚拟DOM树，然后与旧的虚拟DOM树进行对比（diff算法），最后只更新真实DOM中发生变化的部分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vue：&lt;/strong&gt; Vue是一个渐进式JavaScript框架，用于构建用户界面。它被设计为可以自底向上逐层应用。Vue的核心库只关注视图层，易于上手，同时也方便与其他库或现有项目整合。Vue的主要特点包括双向数据绑定、基于HTML的模板语法（也可以使用JSX）、组件化以及响应式系统。Vue的响应式系统基于&lt;code&gt;Object.defineProperty&lt;/code&gt;（Vue 2.x）或Proxy（Vue 3.x），能够追踪数据的变化并自动更新视图。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;相关概念之间的联系和区别：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;共同点：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;组件化：&lt;/strong&gt; 两者都提倡组件化开发，将UI拆分为独立的、可复用的组件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;虚拟DOM：&lt;/strong&gt; 都使用虚拟DOM来提高性能，减少直接操作真实DOM的开销。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式：&lt;/strong&gt; 都提供了响应式的数据绑定机制，数据变化时视图自动更新。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生态系统：&lt;/strong&gt; 都拥有庞大且活跃的社区，提供丰富的工具、库和插件。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;区别：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据流：&lt;/strong&gt; React推崇单向数据流（从父组件到子组件），而Vue支持双向数据绑定（v-model），使得表单处理等场景更为便捷。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模板语法：&lt;/strong&gt; React倾向于使用JSX，将HTML和JS逻辑写在一起；Vue默认使用基于HTML的模板语法，通过指令（如&lt;code&gt;v-if&lt;/code&gt;, &lt;code&gt;v-for&lt;/code&gt;）增强HTML功能，也可以选择使用JSX或渲染函数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态管理：&lt;/strong&gt; React通常结合Redux或Context API进行状态管理；Vue有官方的Vuex。两者都有各自的解决方案来管理复杂应用的状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习曲线：&lt;/strong&gt; 通常认为Vue的学习曲线相对平缓，对前端新手更友好；React由于其JSX和函数式编程的理念，可能需要一定的学习成本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化：&lt;/strong&gt; Vue的响应式系统在很多情况下能自动进行细粒度的更新，减少开发者手动优化的工作；React的性能优化则更多依赖于&lt;code&gt;shouldComponentUpdate&lt;/code&gt;、&lt;code&gt;React.memo&lt;/code&gt;等手动优化手段。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="12-核心用法--示例代码如题目涉及"&gt;1.2 核心用法 + 示例代码（如题目涉及）&lt;/h5&gt;
&lt;p&gt;由于题目是对比差异和选择，这里主要通过对比说明其在项目中的选择场景：&lt;/p&gt;</description></item><item><title>京东-健康-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-39/round-50/</link><pubDate>Sun, 06 Jul 2025 14:16:57 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-39/round-50/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-39/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 中级偏上难度，适合有扎实基础和一定项目经验的应届生。既考察理论知识的深度，也注重实践能力的广度，需要候选人具备较强的学习能力和技术整合能力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; ### 考察范围&lt;/p&gt;
&lt;p&gt;这轮校招面试主要考察四个维度：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;个人经历和项目实战&lt;/strong&gt;：通过学习经历、项目搭建、协作经验考察实际开发能力&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;移动端和多端开发&lt;/strong&gt;：小程序开发、多端适配、移动端优化等实用技能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端基础知识&lt;/strong&gt;：JavaScript核心概念、Vue框架原理、浏览器工作机制等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工程化和架构思维&lt;/strong&gt;：打包工具、插件开发、系统设计等高级能力&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="重点准备知识点"&gt;重点准备知识点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;项目经验的系统性总结和技术亮点提炼&lt;/li&gt;
&lt;li&gt;小程序开发框架和多端适配方案&lt;/li&gt;
&lt;li&gt;JavaScript作用域、变量提升等核心机制&lt;/li&gt;
&lt;li&gt;Vue组件通信、生命周期、插槽等框架特性&lt;/li&gt;
&lt;li&gt;前端性能优化和工程化实践&lt;/li&gt;
&lt;li&gt;实时通讯和AI集成的技术方案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本轮共 25 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-f826f1646088"&gt;1. 介绍自己的学习和实习经历&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;学习路径：从基础到框架的系统性学习过程&lt;/li&gt;
&lt;li&gt;实习经验：具体项目和技术栈的实践应用&lt;/li&gt;
&lt;li&gt;协作能力：与团队成员的配合和沟通经验&lt;/li&gt;
&lt;li&gt;技术深度：不仅会用还要理解原理的学习态度&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在学习经历方面，计算机科学专业背景为前端开发奠定了扎实的理论基础。大学期间系统学习了数据结构、算法、计算机网络等核心课程，这些知识在后续的前端开发中发挥了重要作用。&lt;/p&gt;
&lt;p&gt;前端技术的学习路径比较系统，从HTML、CSS、JavaScript基础开始，逐步深入到现代前端框架。先掌握了Vue.js的基本用法，然后学习了React和小程序开发。在学习过程中特别注重实践，每学习一个新技术都会通过项目来巩固理解。&lt;/p&gt;
&lt;p&gt;实习经历主要集中在两个阶段。第一次实习主要负责公司官网的维护和功能迭代，使用Vue.js技术栈，参与了从需求分析到上线部署的完整流程。这个过程中学会了如何与产品经理、设计师协作，也了解了企业级项目的开发规范。&lt;/p&gt;
&lt;p&gt;第二次实习参与了一个移动端项目的开发，使用uni-app框架实现多端适配。在这个项目中主要负责用户中心模块的开发，包括登录注册、个人信息管理、订单查询等功能。通过这次实习深入了解了移动端开发的特点和挑战。&lt;/p&gt;
&lt;p&gt;在学习和实习过程中，特别注重技术深度的挖掘。不仅学会了如何使用各种技术，更重要的是理解了技术背后的原理。比如学习Vue时，会去了解响应式系统的实现机制；学习webpack时，会研究打包优化的各种策略。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-e7ff151b31f9"&gt;2. 讲一下你的项目搭建过程，用到了哪个脚手架，有没有做其他工作？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;脚手架选择：Vue CLI vs Vite的适用场景和特点&lt;/li&gt;
&lt;li&gt;配置定制：代码规范、构建优化、环境管理&lt;/li&gt;
&lt;li&gt;开发规范：团队协作的标准化流程&lt;/li&gt;
&lt;li&gt;工程化实践：组件库、测试、部署等完整流程&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;项目搭建通常会根据具体需求选择合适的脚手架工具。对于Vue项目，主要使用Vue CLI和Vite两种方案。Vue CLI适合需要复杂配置的企业级项目，提供了完整的插件生态和配置选项。Vite则适合快速开发，启动速度更快，热更新体验更好。&lt;/p&gt;
&lt;p&gt;具体的搭建流程包括几个关键步骤。首先是技术栈选择，根据项目需求确定使用的框架、UI库、状态管理方案等。然后使用脚手架创建基础项目结构，配置开发环境和构建流程。&lt;/p&gt;
&lt;p&gt;在基础搭建完成后，会进行一系列的定制化配置。包括配置ESLint和Prettier确保代码质量，设置路由和状态管理的基础结构，配置axios拦截器处理API请求，设置环境变量管理不同环境的配置。&lt;/p&gt;
&lt;p&gt;还会建立项目的开发规范，包括目录结构规范、组件命名规范、Git提交规范等。这些规范对于团队协作非常重要，能够保证代码的一致性和可维护性。&lt;/p&gt;
&lt;p&gt;在构建优化方面，会配置代码分割、压缩、缓存等策略。对于生产环境，还会配置CDN、Gzip压缩、性能监控等。这些配置虽然不是核心业务逻辑，但对项目的性能和稳定性有重要影响。&lt;/p&gt;
&lt;p&gt;除了技术层面的工作，还会考虑项目的可持续发展。比如建立组件库，提取公共组件和工具函数；配置自动化测试，保证代码质量；建立CI/CD流程，实现自动化部署。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-305821e25fdd"&gt;3. 讲一下你在学校参与的协作项目&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;项目背景：技术栈选择和架构设计&lt;/li&gt;
&lt;li&gt;个人职责：具体负责的模块和功能实现&lt;/li&gt;
&lt;li&gt;协作流程：Git管理、代码审查、敏捷开发&lt;/li&gt;
&lt;li&gt;问题解决：接口对接、代码规范等实际挑战&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在学校期间参与了一个在线学习平台的开发项目，这是一个5人团队的协作项目，持续了一个学期。项目采用前后端分离的架构，前端使用Vue.js，后端使用Node.js。&lt;/p&gt;
&lt;p&gt;在项目中主要负责用户管理和课程展示模块的开发。用户管理包括注册登录、个人信息维护、学习进度跟踪等功能。课程展示模块需要支持视频播放、课件下载、评论互动等复杂功能。&lt;/p&gt;
&lt;p&gt;团队协作方面，使用Git进行版本控制，建立了完整的分支管理策略。主分支用于生产环境，开发分支用于功能集成，每个人都有自己的特性分支。通过Pull Request的方式进行代码审查，确保代码质量。&lt;/p&gt;
&lt;p&gt;项目管理使用敏捷开发方法，每周进行一次迭代规划，每天有简短的站会同步进度。使用Trello进行任务管理，每个功能都有明确的负责人和完成时间。&lt;/p&gt;</description></item><item><title>腾讯-QQ浏览器-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-38/round-49/</link><pubDate>Sun, 06 Jul 2025 13:37:36 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-38/round-49/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-38/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; &lt;strong&gt;中高级难度&lt;/strong&gt;。既有基础概念的深度考察，也有复杂业务场景的解决方案设计，对于校招同学有一定的挑战。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; ### 考察范围&lt;/p&gt;
&lt;p&gt;这轮面试主要考察三个维度：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;项目实战能力&lt;/strong&gt;：通过虚拟列表、Token管理等具体技术方案考察解决复杂业务问题的能力&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端基础功底&lt;/strong&gt;：涵盖浏览器原理、JavaScript核心机制、CSS布局、性能优化等核心知识&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算机基础&lt;/strong&gt;：通过算法题考察数据结构和算法基础&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="重点准备知识点"&gt;重点准备知识点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;虚拟列表等性能优化方案的深度理解和实践经验&lt;/li&gt;
&lt;li&gt;HTTP协议、浏览器工作原理、缓存机制等网络基础&lt;/li&gt;
&lt;li&gt;JavaScript事件循环、闭包、原型链等语言核心特性&lt;/li&gt;
&lt;li&gt;Vue/React框架原理，特别是响应式系统和虚拟DOM&lt;/li&gt;
&lt;li&gt;CSS布局方案和BFC等核心概念&lt;/li&gt;
&lt;li&gt;前端工程化和性能优化实践&lt;/li&gt;
&lt;li&gt;基础算法和数据结构&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="建议"&gt;建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;深入理解前端核心概念，不仅知其然还要知其所以然&lt;/li&gt;
&lt;li&gt;积累实际项目经验，特别是性能优化和复杂业务场景的解决方案&lt;/li&gt;
&lt;li&gt;保持对新技术的敏感度，了解技术发展趋势&lt;/li&gt;
&lt;li&gt;加强计算机基础，算法和数据结构是技术能力的重要体现&lt;/li&gt;
&lt;li&gt;培养系统性思维，能够从多个角度分析和解决问题&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本轮共 20 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-fbe5211ce8dc"&gt;1. 请讲一下你项目中的的虚拟列表，包括实现原理、优化过程以及如何设置缓冲区？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;核心原理：只渲染可视区域，动态计算显示范围&lt;/li&gt;
&lt;li&gt;关键技术：滚动监听、索引计算、位置缓存&lt;/li&gt;
&lt;li&gt;优化重点：动态高度处理、缓冲区设置、滚动性能&lt;/li&gt;
&lt;li&gt;实际考虑：内存占用与性能平衡&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;虚拟列表是解决大数据量列表渲染性能问题的核心方案。其实现原理基于&amp;quot;只渲染可视区域&amp;quot;的思想。&lt;/p&gt;
&lt;p&gt;具体实现上，首先需要确定容器的可视高度和每个列表项的高度。通过监听滚动事件，实时计算当前滚动位置对应的起始索引和结束索引。核心公式是：起始索引 = Math.floor(scrollTop / itemHeight)，结束索引 = 起始索引 + Math.ceil(containerHeight / itemHeight)。&lt;/p&gt;
&lt;p&gt;在优化过程中遇到的主要挑战是处理动态高度的列表项。解决方案是维护一个位置缓存数组，记录每个列表项的实际高度和累计偏移量。当列表项高度发生变化时，需要更新缓存并重新计算后续项的位置。&lt;/p&gt;
&lt;p&gt;缓冲区设置是性能优化的关键。通常在可视区域前后各增加5-10个列表项作为缓冲，具体数量需要根据列表项的复杂度和渲染耗时来调整。缓冲区过小会导致快速滚动时出现白屏，过大则会增加内存占用和渲染负担。&lt;/p&gt;
&lt;p&gt;对于滚动性能优化，还需要结合防抖节流、requestAnimationFrame等技术，确保滚动的流畅性。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-2e4835cecc28"&gt;2. 在虚拟列表中，如何结合防抖和节流技术优化性能？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;节流应用：滚动事件实时响应，保证连续性操作的流畅度&lt;/li&gt;
&lt;li&gt;防抖应用：计算密集操作、数据预加载等非实时场景&lt;/li&gt;
&lt;li&gt;组合策略：根据不同操作特性选择合适的优化方案&lt;/li&gt;
&lt;li&gt;参数调优：时间间隔需要平衡性能和用户体验&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在虚拟列表的性能优化中，防抖和节流扮演着不同但互补的角色。&lt;/p&gt;
&lt;p&gt;对于滚动事件本身，节流是更合适的选择。因为滚动是连续性操作，用户期望得到实时反馈，而不是等待操作结束后才响应。通常设置16-33ms的节流间隔，对应60-30fps的更新频率，既保证了流畅度又避免了过度计算。&lt;/p&gt;
&lt;p&gt;防抖则主要用于一些计算密集型的操作。比如当滚动停止后，可能需要进行数据预加载、图片懒加载等操作，这些可以使用防抖来避免频繁触发。另外，对于搜索框结合虚拟列表的场景，搜索关键词的处理也适合使用防抖。&lt;/p&gt;
&lt;p&gt;在实际实现中，还需要考虑组合使用的场景。比如可以对滚动事件使用节流进行实时响应，同时对复杂的重新计算逻辑使用防抖进行优化。这样既保证了用户体验，又避免了不必要的性能消耗。&lt;/p&gt;
&lt;p&gt;需要注意的是，节流和防抖的时间设置需要根据具体业务场景调整，过短可能达不到优化效果，过长则会影响用户体验。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-07425dedaf84"&gt;3. 如何使用 requestAnimationFrame 优化虚拟列表的滚动性能？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;核心优势：与浏览器重绘周期同步，避免无效渲染&lt;/li&gt;
&lt;li&gt;应用场景：DOM更新调度、动画优化、时间切片&lt;/li&gt;
&lt;li&gt;性能提升：减少重排重绘、合并多次操作、避免掉帧&lt;/li&gt;
&lt;li&gt;注意事项：刷新率适配、兼容性考虑&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;requestAnimationFrame是浏览器提供的专门用于动画优化的API，它能够确保回调函数在浏览器下一次重绘之前执行，这对虚拟列表的滚动性能优化具有重要意义。&lt;/p&gt;</description></item><item><title>腾讯-暑期实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-37/round-48/</link><pubDate>Sun, 29 Jun 2025 13:39:17 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-37/round-48/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-37/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 主要几种在以下几个方向：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vue3原理&lt;/li&gt;
&lt;li&gt;前端工程化：webpack、vite、pnpm、monorepo&lt;/li&gt;
&lt;li&gt;前端安全&lt;/li&gt;
&lt;li&gt;计算机网络&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-20e6c69e8673"&gt;1. JSON数组扁平化&amp;amp;数据过滤&lt;/h2&gt;
&lt;p&gt;假设有一个模拟接口 &lt;code&gt;fetchData()&lt;/code&gt;，返回 Promise 对象，数据格式为：&lt;br&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;#34;data&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#f92672"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#f92672"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;children&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#f92672"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt; } ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要求：&lt;br&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;将接口返回的嵌套数据结构扁平化为一维数组&lt;/strong&gt;；&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;筛选出 &lt;strong&gt;&lt;code&gt;value&lt;/code&gt;&lt;/strong&gt; 大于等于 8 的元素&lt;/strong&gt;；&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按 &lt;strong&gt;&lt;code&gt;id&lt;/code&gt;&lt;/strong&gt; 升序排列后，渲染为 &lt;strong&gt;&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;&lt;/strong&gt; 列表&lt;/strong&gt;。&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;示例输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;id:2, value:10&amp;lt;/&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;id:3, value:8&amp;lt;/&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;递归与数据结构处理&lt;/strong&gt;：考查候选人是否理解如何处理嵌套结构。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数组操作基础&lt;/strong&gt;：filter/sort/map 等高阶方法掌握情况。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异步处理能力&lt;/strong&gt;：是否熟悉 &lt;code&gt;Promise&lt;/code&gt; 的使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原生 DOM 操作&lt;/strong&gt;：不用框架的情况下渲染 HTML。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;此题本质是一个数据处理与 DOM 渲染综合题，目标包括：&lt;/p&gt;</description></item><item><title>字节-今日头条-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/round-45/</link><pubDate>Fri, 27 Jun 2025 08:02:45 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/round-45/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/round-46/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础知识和工程化实践&lt;/p&gt;
&lt;p&gt;本轮共 19 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-1760562f8190"&gt;1. 介绍一下简历中的组件库项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;非唯一标准答案&lt;/strong&gt;：本题是主观型问题，没有唯一的标准答案，主要考察面试者的综合能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;考察能力&lt;/strong&gt;：面试官主要考察您的表达能力、对项目背景和技术细节的理解、解决问题的思路系统性，以及项目复盘和总结的能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;答题结构建议&lt;/strong&gt;：建议从项目背景和目的、技术选型与核心功能、遇到的挑战与解决方案、个人贡献与收获等方面展开阐述，力求条理清晰、重点突出。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="高质量参考范文"&gt;高质量参考范文：&lt;/h5&gt;
&lt;p&gt;在我的简历中，我提到了一个组件库项目，这个项目是我在实习期间为了统一团队UI规范，提升开发效率而主导或参与开发的。我们的目标是构建一套覆盖常用UI组件（如按钮、输入框、弹窗、表格等）的跨框架（或特定框架如Vue/React）的组件库，以满足业务快速迭代的需求，并保证产品界面的一致性。&lt;/p&gt;
&lt;p&gt;在技术选型上，我们选择了Vue 3 + TypeScript + Vite + Sass Modules作为核心技术栈。Vue 3 的 Composition API 帮助我们更好地组织组件逻辑，提升了组件的复用性和可维护性；TypeScript则保证了代码的类型安全，尤其是在大型项目协作中大大减少了潜在的类型错误。Vite作为构建工具，极大地提升了开发服务器的启动速度和热更新效率。在样式方面，我们采用了Sass Modules，确保了组件样式的局部作用域，避免了全局污染，同时通过Sass的变量和混入特性，提升了样式代码的可维护性。&lt;/p&gt;
&lt;p&gt;在核心功能实现上，我们关注了组件的通用性和可配置性。例如，在实现一个Select组件时，我们不仅考虑了基本选择功能，还加入了搜索过滤、多选、自定义渲染模板、异步加载选项等高级特性。每个组件都经过了详细的API设计和文档编写，确保其他开发者能够快速上手和正确使用。我们还集成了单元测试和端到端测试，以保证组件的质量和稳定性。&lt;/p&gt;
&lt;p&gt;在项目过程中，我们也遇到了一些挑战。例如，如何设计一套灵活的主题机制，使得组件库能够轻松适应不同业务线的品牌风格，我们最终通过CSS Variables和一套主题生成工具解决了这个问题。另一个挑战是性能优化，特别是大型组件（如虚拟列表的表格）的渲染性能，我们通过按需加载、虚拟滚动等技术手段，确保了组件在处理大量数据时依然保持流畅。&lt;/p&gt;
&lt;p&gt;通过这个组件库项目，我不仅深入理解了前端组件化开发的最佳实践，也锻炼了我在项目规划、技术选型、问题解决和团队协作方面的能力。我觉得最大的收获是，看到自己开发的组件被其他业务方广泛使用，并有效提升了他们的开发效率时，那种成就感是非常大的。这个项目也让我对前端工程化有了更深刻的理解，认识到标准化、自动化和高质量交付对于前端开发的重要性。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-61d0b68b7fb6"&gt;2. vite 和 webpack 有什么区别？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;构建工具的理解&lt;/strong&gt;：面试官希望了解面试者对前端构建工具的整体认知，包括它们在前端开发流程中的作用和重要性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vite与Webpack的核心差异&lt;/strong&gt;：考察面试者是否能清晰阐述两者在开发模式（Dev Server）和生产模式（Build）上的根本性区别，特别是它们处理模块依赖和启动开发服务器的方式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化&lt;/strong&gt;：面试官想确认面试者是否能从性能角度分析两者的优劣，特别是Vite如何利用ESM（ECMAScript Modules）和原生浏览器支持实现快速的开发体验。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术趋势&lt;/strong&gt;：考察面试者是否关注前端生态的新技术发展，并能理解新技术带来的优势和对现有工具的影响。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Webpack&lt;/strong&gt;：
Webpack 是一个模块打包器。在开发模式下，Webpack 会将整个应用的所有模块（JavaScript、CSS、图片等）打包成浏览器可以识别的静态资源。在启动开发服务器之前，它需要完成整个打包过程。当代码发生修改时，Webpack 会重新编译并生成新的打包文件，然后通过热模块替换（HMR）机制将更新注入到浏览器中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vite&lt;/strong&gt;：
Vite 是一种基于浏览器原生 ES Modules 的构建工具。在开发模式下，Vite 不会预先打包整个应用。它利用浏览器对 ES Modules 的原生支持，当浏览器请求某个模块时，Vite 会即时地对该模块进行转换（例如处理 TypeScript、Vue/React 单文件组件等），然后直接提供给浏览器。这极大地减少了开发服务器的启动时间和热更新的时间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心区别与联系&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开发模式启动速度&lt;/strong&gt;：Webpack 需要先打包再启动服务，随着项目规模增大，打包时间会显著增加。Vite 则利用浏览器原生 ES Modules 按需加载，实现了&amp;quot;冷启动&amp;quot;的秒开。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;热更新（HMR）机制&lt;/strong&gt;：Webpack 的热更新通常需要重新编译被修改的模块及其依赖链。Vite 的热更新同样基于 ES Modules，当一个模块被修改时，Vite 只需要精确地替换该模块及其直接相关的部分，更新速度更快，因为不需要重新构建整个依赖图。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生产环境构建&lt;/strong&gt;：尽管开发模式下两者原理不同，但在生产环境构建时，Vite 内部仍然会使用 Rollup 进行打包，类似于 Webpack 的打包输出，以获得最佳的兼容性和性能优化（例如代码分割、Tree-shaking 等）。这意味着 Vite 在生产构建阶段也进行打包，并非完全无打包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;底层技术&lt;/strong&gt;：Webpack 依赖于自己的模块解析和打包机制，而 Vite 则深度依赖于浏览器原生的 ES Modules 特性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;为什么会出现 Vite&lt;/strong&gt;：随着前端项目日益庞大，基于打包器的开发服务器在冷启动和热更新方面的性能瓶颈日益凸显。Vite 的出现正是为了解决这一痛点，通过利用浏览器原生能力，显著提升开发效率和体验。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="12-核心用法--使用场景"&gt;1.2 核心用法 + 使用场景&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vite 的优势使用场景&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;大型项目开发&lt;/strong&gt;：对于拥有大量模块和复杂依赖的项目，Vite 的即时按需编译能够显著缩短开发服务器的启动时间和热更新响应时间，提升开发效率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;追求极致开发体验&lt;/strong&gt;：如果你希望在开发过程中获得近乎瞬时的代码修改反馈，Vite 是一个理想的选择。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新建项目&lt;/strong&gt;：对于新项目，Vite 提供了更现代、更快速的开发起点。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Webpack 的优势使用场景&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;老旧项目或复杂构建需求&lt;/strong&gt;：对于历史项目，或需要高度定制化构建流程（例如微前端、特殊资源处理）的项目，Webpack 成熟的生态系统和灵活的配置依然是其优势。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对浏览器兼容性有极高要求&lt;/strong&gt;：Webpack 拥有更广泛的浏览器兼容性处理能力，可以通过各种 Loader 和 Plugin 支持老旧浏览器特性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心用法体现&lt;/strong&gt;：
无论是 Vite 还是 Webpack，它们的核心目标都是为了提供更好的开发体验和生产环境下的代码优化。Vite 通过&amp;quot;开发阶段无打包&amp;quot;的理念解决了传统打包器的性能痛点，而 Webpack 则以其强大的生态和高度可配置性，满足了各种复杂的构建需求。开发者在项目中选择使用哪种工具，通常取决于项目规模、团队熟悉度、对开发效率和生产环境性能的权衡。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="13-常见误区或面试陷阱"&gt;1.3 常见误区或面试陷阱&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;误区一：Vite 在生产环境也是无打包的。&lt;/strong&gt;
这是一个常见的误解。Vite 在开发环境利用原生 ESM 实现按需加载，确实没有预打包的步骤。但为了在生产环境中获得最佳的性能和兼容性（例如代码压缩、Tree-shaking、兼容性处理等），Vite 仍然会使用 Rollup 进行打包。面试时如果直接说 Vite 生产环境也无打包，会暴露对 Vite 工作原理理解不深。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;误区二：Vite 能够完全替代 Webpack。&lt;/strong&gt;
尽管 Vite 在许多方面表现出色，尤其是在开发体验上，但它并不能在所有场景下完全替代 Webpack。Webpack 的生态系统更加庞大和成熟，拥有更多针对特定场景的 Loader 和 Plugin，其配置灵活性也更高。例如，一些复杂的构建需求、特定的兼容性要求或集成旧技术栈时，Webpack 可能会是更稳健的选择。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;误区三：只强调速度快，不深入原理。&lt;/strong&gt;
面试官更希望听到你对 Vite 和 Webpack 底层原理的理解，而不仅仅是停留在&amp;quot;Vite 比 Webpack 快&amp;quot;的表层认知。理解它们在模块处理、HMR 实现、构建流程上的差异，并能结合实际场景分析各自的优劣，才能体现出更深入的理解。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;误区四：混淆&amp;quot;打包&amp;quot;和&amp;quot;编译/转换&amp;quot;。&lt;/strong&gt;
Vite 在开发模式下不是&amp;quot;打包&amp;quot;，而是对单个文件进行&amp;quot;编译/转换&amp;quot;以适应浏览器。而 Webpack 则是在启动服务前进行完整的&amp;quot;打包&amp;quot;过程。清晰区分这两个概念很重要。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-7babb4ebd32f"&gt;3. vite 打包可能会有什么问题呢？需要怎么处理？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vite 生产环境构建的理解&lt;/strong&gt;：考察面试者是否清楚 Vite 在开发和生产环境的不同工作机制，特别是它在生产环境如何进行打包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常见打包问题及解决方案&lt;/strong&gt;：面试官想了解面试者是否遇到过 Vite 打包过程中可能出现的问题，以及如何诊断和解决这些问题，体现解决实际问题的能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rollup 配置的掌握&lt;/strong&gt;：由于 Vite 生产环境依赖 Rollup，面试官会关注面试者是否了解如何通过配置 Rollup 来解决特定的打包问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化与兼容性&lt;/strong&gt;：考察面试者在打包层面如何考虑应用的性能和浏览器兼容性，以及如何通过打包工具进行优化。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明-1"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;尽管 Vite 在开发模式下以其&amp;quot;无打包&amp;quot;的理念提供极速体验，但在生产环境，它仍然需要对代码进行打包，以实现最佳的性能优化和兼容性。Vite 内部使用 &lt;a href="https://rollupjs.org/"&gt;Rollup&lt;/a&gt; 作为其生产环境的打包工具。Rollup 的优势在于其高效的 Tree-shaking（清除未使用的代码）和生成优化过的 ES Modules 捆绑包。因此，Vite 打包时可能遇到的问题，很多时候是与 Rollup 的打包特性、插件机制以及项目本身的特定需求相关的。&lt;/p&gt;</description></item><item><title>阿里-蚂蚁金服-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-34/round-42/</link><pubDate>Fri, 27 Jun 2025 06:05:39 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-34/round-42/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-34/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-34/round-43/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-086d87101a30"&gt;1. 数组排序：实现一个函数，对包含数字和字符串的混合数组进行排序，数字在前按升序，字符串在后按字母顺序。&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;JavaScript算法。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sortMixedArray&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;sort&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;typeA&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;typeof&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;typeB&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;typeof&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;typeA&lt;/span&gt; &lt;span style="color:#f92672"&gt;!==&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;typeB&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;typeA&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;number&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;typeA&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;localeCompare&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id="question-subjective-11d6fb8e8fe1"&gt;2. 发布订阅模式：实现一个简单的EventEmitter类，包含on, emit, off方法。&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;JavaScript设计模式。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;EventEmitter&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;constructor&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;on&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;emit&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;, ...&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt;(...&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;off&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;cb&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;cb&lt;/span&gt; &lt;span style="color:#f92672"&gt;!==&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id="question-subjective-33ea8704520e"&gt;3. lodash.get实现：实现一个类似lodash.get的函数，安全地获取嵌套对象属性。&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;JavaScript对象操作。&lt;/p&gt;</description></item><item><title>阿里-阿里妈妈-实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-33/round-40/</link><pubDate>Fri, 27 Jun 2025 06:04:12 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-33/round-40/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-33/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-33/round-41/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 13 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-9ff563bd8749"&gt;1. 实现第一个元素不移动后续元素与左边相隔8px（:not(:first-child）&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS选择器与布局。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;要实现第一个元素不移动，后续元素与左边相隔8px，可以使用CSS中的&lt;code&gt;:not(:first-child)&lt;/code&gt;选择器来选择除第一个元素外的所有同级元素，并为其设置左边距。这在布局中非常有用，可以避免对第一个元素应用不必要的样式。以下是一个示例：&lt;br&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;container&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&amp;gt;Item 1&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&amp;gt;Item 2&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&amp;gt;Item 3&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&amp;gt;Item 4&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;first-child&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin-left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在这个示例中，&lt;code&gt;.item:not(:first-child)&lt;/code&gt;选择器匹配了所有带有&lt;code&gt;item&lt;/code&gt;类的元素，除了第一个元素。然后，我们通过&lt;code&gt;margin-left: 8px&lt;/code&gt;为这些元素设置了左边距，使它们与左边的元素相隔8px。第一个元素不会受到影响，因此不会产生左边距，从而实现了题目要求的布局效果。这种技术在创建水平排列的元素时非常有用，例如导航栏或标签页，可以确保第一个元素与容器的边缘对齐，而后续元素之间保持一致的间距。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-c77b5c6f-9fcc-40a6-bbf0-9f412d6ce94c"&gt;2. 写一个防抖&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/c77b5c6f-9fcc-40a6-bbf0-9f412d6ce94c"&gt;实现 debounce（防抖）函数&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;触发高频时间后n秒内函数只会执行一次,如果n秒内高频时间再次触发,则重新计算时间。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;触发高频时间后n秒内函数只会执行一次,如果n秒内高频时间再次触发,则重新计算时间。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;debounce&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;fn&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;time&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;timeout&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;clearTimeout&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;timeout&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;timeout&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setTimeout&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fn&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;apply&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;arguments&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, &lt;span style="color:#a6e22e"&gt;time&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;防抖常应用于用户进行搜索输入节约请求资源，window触发resize事件时进行防抖只触发一次。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-0b51a6d42592"&gt;3. 讲讲你的项目难点&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;项目经验与问题解决能力。&lt;/p&gt;</description></item><item><title>阿里-国际电商-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-32/round-38/</link><pubDate>Fri, 27 Jun 2025 06:02:07 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-32/round-38/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-32/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-32/round-39/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 19 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-5605b7f269f9"&gt;1. 讲一下你的技术栈，为什么要学前端，如何学习前端的？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;技术栈、学习动机与方法。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;ol&gt;
&lt;li&gt;技术栈：
&lt;ol&gt;
&lt;li&gt;HTML/CSS：用于构建页面结构和样式。&lt;/li&gt;
&lt;li&gt;JavaScript：包括ES6+特性，用于实现页面交互。&lt;/li&gt;
&lt;li&gt;框架：熟练使用Vue.js和React，了解其生态系统（如Vue Router、Vuex、React Router、Redux）。&lt;/li&gt;
&lt;li&gt;构建工具：使用Vite和Webpack进行项目构建和优化。&lt;/li&gt;
&lt;li&gt;状态管理：使用Vuex和Redux进行状态管理。&lt;/li&gt;
&lt;li&gt;UI组件库：使用Element UI、Ant Design等。&lt;/li&gt;
&lt;li&gt;其他工具：Git、ESLint、Prettier、Jest等。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;学习动机：
&lt;ol&gt;
&lt;li&gt;前端开发结合了技术和创意，能够直接看到代码转化为用户界面，带来了即时满足感。&lt;/li&gt;
&lt;li&gt;前端领域技术更新快，充满挑战，提供了不断学习新知识的机会。&lt;/li&gt;
&lt;li&gt;对用户界面和交互设计的兴趣，希望创造良好的用户体验。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;学习方法：
&lt;ol&gt;
&lt;li&gt;在线课程：通过Coursera、Udemy、MDN Web Docs等平台学习基础知识。&lt;/li&gt;
&lt;li&gt;实践项目：通过个人项目和开源项目应用所学知识。&lt;/li&gt;
&lt;li&gt;阅读书籍：如《JavaScript高级程序设计》、《你不知道的JavaScript》。&lt;/li&gt;
&lt;li&gt;参与社区：在GitHub、Stack Overflow等社区与开发者交流，解决遇到的问题。&lt;/li&gt;
&lt;li&gt;技术博客：关注CSS-Tricks、JavaScript.info等博客，了解新技术和最佳实践。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-ae93b62f-d9ef-46c2-8151-da164426f49f"&gt;2. 常见的H5标签有哪些 ，你是怎么用的&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/ae93b62f-d9ef-46c2-8151-da164426f49f"&gt;常见的H5标签有哪些 ，你是怎么用的&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;常见 H5 标签包括结构语义标签、文本语义标签、表单标签和媒体标签；实际使用中优先考虑语义表达和可访问性，而非样式；充分利用表单和媒体标签的原生能力以减少 JS 复杂度；&lt;code&gt;canvas&lt;/code&gt; 与 &lt;code&gt;svg&lt;/code&gt; 需根据场景选择；合理使用语义化标签能显著提升页面质量和长期可维护性。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在实际工程中，H5 标签并不是“记住有哪些”，而是&lt;strong&gt;是否理解它们在语义、结构、可访问性和默认行为上的差异，并能在合适的场景中使用&lt;/strong&gt;。对标签的理解，直接影响页面结构质量、SEO 以及后续的可维护性。&lt;/p&gt;
&lt;p&gt;从结构层面看，最常用的一类是&lt;strong&gt;语义化结构标签&lt;/strong&gt;。例如 &lt;code&gt;header&lt;/code&gt;、&lt;code&gt;nav&lt;/code&gt;、&lt;code&gt;main&lt;/code&gt;、&lt;code&gt;section&lt;/code&gt;、&lt;code&gt;article&lt;/code&gt;、&lt;code&gt;aside&lt;/code&gt;、&lt;code&gt;footer&lt;/code&gt;。在页面搭建时，通常会用 &lt;code&gt;header&lt;/code&gt; 承载页面或模块级头部信息，用 &lt;code&gt;nav&lt;/code&gt; 明确标识导航区域，用 &lt;code&gt;main&lt;/code&gt; 作为页面主体的唯一入口，再用 &lt;code&gt;section&lt;/code&gt; 或 &lt;code&gt;article&lt;/code&gt; 对内容进行分块。这类标签本身不改变样式，但会向浏览器、搜索引擎和辅助技术清晰表达“这块内容的角色是什么”，比单纯使用 &lt;code&gt;div&lt;/code&gt; 更具表达力。&lt;/p&gt;</description></item><item><title>阿里-灵犀互娱-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-31/round-36/</link><pubDate>Fri, 27 Jun 2025 06:00:30 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-31/round-36/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-31/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-31/round-37/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-745bcd0bd804"&gt;1. 先简单自我介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;自我认知。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;您好，我叫[你的名字]，毕业于[学校名称]的[专业名称]专业。在大学期间，我就对计算机科学产生了浓厚的兴趣，尤其是前端开发领域。在学习和实践中，我积累了扎实的编程基础，熟练掌握了HTML、CSS、JavaScript等前端开发技术，并在多个项目中担任核心开发角色。我热爱前端开发工作，喜欢通过代码创造用户友好的界面和交互体验。在业余时间，我会不断学习新技术，提升自己的专业能力。我希望能够在一个富有创新和挑战的环境中工作，与优秀的团队成员共同成长。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-0758f3ea2c02"&gt;2. 什么时候学前端？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;学习经历。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我是在大学二年级的时候开始接触前端开发的。当时，我选修了一门网页设计与开发的课程，这让我对前端开发产生了浓厚的兴趣。从那时起，我便开始系统地学习HTML、CSS和JavaScript等前端技术，并通过大量的实践项目不断提升自己的技能。毕业后，我继续深入学习前端框架和工具，如Vue、React等，并在实际工作中不断积累经验。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-0ee7770504c2"&gt;3. 怎么学前端？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;学习方法。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;学习前端开发需要系统的学习和不断的实践。首先，我从基础的HTML、CSS和JavaScript开始，通过阅读书籍、在线教程和官方文档，打下了坚实的基础。然后，我深入学习了前端框架，如Vue和React，通过实践项目来理解框架的核心概念和使用方法。同时，我积极参与开源项目和在线社区，与其他开发者交流经验，解决遇到的问题。此外，我还关注前端技术的最新发展趋势，通过参加技术会议、观看在线课程等方式不断更新自己的知识体系。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-9b77d3095037"&gt;4. 你的未来规划？&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;职业规划。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我的短期目标是在前端开发领域持续深耕，提升自己的技术能力和项目经验。我希望能够在当前的岗位上承担更多的责任，参与复杂项目的开发，并不断优化现有系统的性能和用户体验。长期来看，我希望能够成为前端技术专家，带领团队进行技术创新和项目研发。同时，我也希望能够不断提升自己的架构设计能力和团队管理能力，为公司的技术发展做出更大的贡献。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-4a1a8c54feda"&gt;5. 你觉得你什么地方比较强？哪里比较薄弱？&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;自我认知。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我认为我的强项在于对前端技术的深入理解和实践经验。我能够快速学习新技术，并将其应用到实际项目中。同时，我具备良好的问题解决能力和团队协作精神，能够与团队成员高效合作，共同完成项目目标。然而，我也意识到自己在某些方面还有提升的空间。例如，在性能优化和大型项目的架构设计方面，我还需要进一步积累经验。此外，我还需要加强对后端技术的了解，以更好地进行前后端协同开发。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-f6c8f24757b3"&gt;6. 一个前端架构师要有什么长处？&lt;/h2&gt;
&lt;h3 id="题目要点-5"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;职业素养。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;一个优秀的前端架构师需要具备多方面的长处。首先，需要有深厚的技术功底，对前端技术栈有全面而深入的理解，包括HTML、CSS、JavaScript、前端框架、构建工具等。其次，需要具备良好的系统设计和架构能力，能够设计出高性能、可扩展、易维护的前端系统。此外，前端架构师还需要有较强的项目管理能力，能够领导团队进行项目的规划、开发和交付。良好的沟通能力和团队协作精神也是必不可少的，能够与产品、后端团队等进行有效的沟通和协作。最后，前端架构师需要有敏锐的技术洞察力，能够关注行业动态，引入新的技术和方法，推动团队的技术进步。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-0c0db5d1-e09a-4699-911a-3cfa4f4bd765"&gt;7. 微前端是什么？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/0c0db5d1-e09a-4699-911a-3cfa4f4bd765"&gt;什么是微前端？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-6"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;微前端（Micro-Frontends）是一种类似于微服务的架构，它将微服务的理念应用于浏览器端，即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;微前端（Micro-Frontends）是一种类似于微服务的架构，它将微服务的理念应用于浏览器端，即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。&lt;/p&gt;
&lt;p&gt;各个前端应用还可以独立运行、独立开发、独立部署。&lt;/p&gt;
&lt;p&gt;微前端不是单纯的前端框架或者工具，而是一套架构体系，&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-1c3850f1-2fdf-46a8-8b6e-ff9a6f1abf08"&gt;8. SPA和MPA的区别？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/1c3850f1-2fdf-46a8-8b6e-ff9a6f1abf08"&gt;SPA和MPA的区别？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-7"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;SPA 通过前端路由在单一 HTML 中完成页面切换，交互流畅但首屏和 SEO 成本较高；MPA 每次导航请求新页面，SEO 友好且隔离性强，但交互体验有限；两者本质差异在于前后端渲染与路由职责的划分；现代项目常通过 SSR、SSG 等方式在两种模式之间折中。&lt;/p&gt;</description></item><item><title>阿里-智能产品事业部-暑期实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-30/round-35/</link><pubDate>Fri, 27 Jun 2025 05:57:10 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-30/round-35/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-30/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 18 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-0583a5eb88da"&gt;1. 请介绍一下你在 [具体项目名称] 中主要做了哪些工作？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;项目经验。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;回答参考：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;项目架构设计：参与设计项目的整体架构，选择前端技术栈。考虑到项目规模和性能需求，选择了 Vue.js 作为前端框架，Vuex 进行状态管理，Vue Router 实现单页面应用的路由管理，Vite 作为构建工具。这些技术的选择旨在提高开发效率和应用性能。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;核心模块开发：负责开发用户认证模块，实现了基于 JWT（JSON Web Token）的登录、注册和权限管理功能。通过与后端 API 的紧密协作，确保了用户数据的安全传输和存储。同时，开发了数据可视化模块，利用 ECharts 库展示复杂的业务数据，帮助用户更直观地理解和分析数据。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;性能优化：通过分析页面的性能瓶颈，实施了一系列优化措施。例如，采用代码分割技术将应用拆分成多个小块，实现按需加载；使用懒加载技术延迟加载非首屏资源；对图片资源进行压缩和格式优化，减少页面加载时间。这些优化显著提升了页面的加载速度，改善了用户体验。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代码审查与测试：积极参与代码审查过程，遵循项目编码规范，确保代码质量。编写了大量的单元测试和集成测试用例，使用测试框架（如 Jest）进行自动化测试，确保代码的稳定性和可靠性，减少上线后的潜在问题。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8c38cc2d315c"&gt;2. 在 [具体项目名称] 中，遇到了哪些技术难点？你是如何解决的？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;问题解决能力。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;回答参考：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;跨浏览器兼容性：项目需要支持多个主流浏览器，包括一些旧版本的浏览器。为了解决这一问题，使用 Babel 将 ES6+ 代码转译为 ES5，确保大部分现代 JavaScript 特性能够在旧浏览器中运行。同时，引入 Polyfill 库来补充那些浏览器原生不支持的 API，例如 Promise、fetch 等。此外，使用 Autoprefixer 工具为 CSS 添加必要的浏览器前缀，确保 CSS 样式在不同浏览器中的一致性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;性能优化：随着项目规模的扩大，页面的加载时间和交互响应时间面临着挑战。通过分析，发现主要的性能瓶颈在于大量的初始 JavaScript 包和未优化的图片资源。为解决此问题，实施了代码分割策略，将应用的代码分割成多个小块，按需加载，减少了初始加载的包大小。同时，将图片资源转换为 WebP 格式，并实现了图片的懒加载，只有在用户滚动到图片位置时才加载图片，从而显著缩短了页面的初始加载时间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;后端 API 集成：在开发过程中，遇到了 API 响应数据格式不一致的问题，这给前端的数据处理带来了困难。为了解决这个问题，设计了一个统一的数据处理中间层，对后端返回的数据进行预处理和格式化，使其符合前端的要求。同时，与后端团队进行了深入沟通，推动他们优化 API 设计，以更好地满足前端的需求。&lt;/p&gt;</description></item><item><title>阿里-阿里云-暑期实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-29/round-34/</link><pubDate>Fri, 27 Jun 2025 05:49:45 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-29/round-34/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-29/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 一共三轮面试，经过整理后形成该面经。&lt;/p&gt;
&lt;p&gt;主要考察了候选人的实习经历、项目经验以及对前端工具和技术的理解。问题涵盖了从Vite插件开发到模块管理等多个方面，重点测试了候选人的实际操作能力和对技术细节的掌握。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试深度考察工程化全链路能力（Vite插件开发/预构建/HMR原理）、性能优化实战（INP项目包体积↓40%/LCP时间↓50%）、跨端架构设计（JavaScript Bridge通信/兼容性治理）及模块化高级应用（单例设计/循环依赖检测）。难点聚焦于pnpm幽灵依赖治理、Vite HMR全流程解析及Node.js运行时设计思想。&lt;/p&gt;
&lt;p&gt;本轮共 32 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-8e9bf321df59"&gt;1. 请介绍你在乾象、腾讯的实习经历，包括实习期间遇到的难点和亮点。&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;实习经历, 项目背景, 技术挑战, 解决方案, 成绩, 亮点&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;可以从项目背景、具体职责、遇到的技术挑战及解决方案等方面进行阐述。同时，可以分享一些在实习中取得的成绩或亮点，比如优化效果、团队协作等。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-e9efc1766bce"&gt;2. 现场实现一个最近开发的模块/组件，例如 URL Filter。&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;设计思路, 实现过程, 单元测试, 代码示例&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;可以详细描述这个模块/组件的设计思路、实现过程以及如何进行单元测试。如果可能的话，还可以展示一些代码片段来说明关键部分。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-9a4f386ff5db"&gt;3. 在实习期间开发的 Vite 插件的功能是如何实现的？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;架构兼容性&lt;/strong&gt;：理解 Vite 插件如何复用 Rollup 钩子并扩展开发环境特有的 Server 钩子。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;钩子应用场景&lt;/strong&gt;：能够准确区分 &lt;code&gt;config&lt;/code&gt;（配置修改）、&lt;code&gt;resolveId&lt;/code&gt;/&lt;code&gt;load&lt;/code&gt;（路径解析）、&lt;code&gt;transform&lt;/code&gt;（代码改写）的应用边界。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AST 与代码转换&lt;/strong&gt;：掌握如何通过 AST 操纵实现对代码的无损增强，并维持 SourceMap 的连续性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境控制&lt;/strong&gt;：利用 &lt;code&gt;configureServer&lt;/code&gt; 扩展中间件，以及通过 &lt;code&gt;handleHotUpdate&lt;/code&gt; 实现精准的热更新控制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;虚拟模块技术&lt;/strong&gt;：利用虚拟模块机制实现编译时信息的动态注入。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Vite 插件的实现本质上是基于 Rollup 插件接口的扩展，并结合了 Vite 特有的开发服务器钩子。可以从插件系统的架构设计、生命周期钩子（Hooks）的执行时序、以及针对开发环境与生产环境的差异化处理三个维度进行回答。&lt;/p&gt;</description></item><item><title>阿里-盒马-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-28/round-32/</link><pubDate>Fri, 27 Jun 2025 05:48:59 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-28/round-32/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-28/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-28/round-33/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 聚焦前端基础深度：虚拟DOM性能边界（复杂DOM场景优劣）、响应式布局实现（媒体查询/弹性布局）、浏览器兼容性实战（Polyfill/Babel）、微信小程序架构设计理念。难点在于Rem计算优化策略和O(1)空间复杂度的字符串逆序算法设计。&lt;/p&gt;
&lt;p&gt;本轮共 10 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-12b75c445924"&gt;1. 自我介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;个人背景、技能、经验、职业规划等。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;参考模版如下，一般3分钟以内即可。&lt;br&gt;
面试官您好！我叫[姓名]，毕业于[毕业院校]，专业是[专业名称]。我有XX段前端开发实习经验，熟练掌握HTML、CSS、JavaScript等前端技术栈，主要的技术栈是React。在XX公司实习期间，主要参与过供应链管理系统和微信小程序开发，学习了前端相关专业技术，以及熟悉了项目的整体流程，同时积累了丰富的项目经验。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-5573b31b-5f00-409c-b032-3285ac844d62"&gt;2. React 的虚拟 DOM 解决了什么问题？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/5573b31b-5f00-409c-b032-3285ac844d62"&gt;React 的虚拟 DOM 解决了什么问题？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;跨平台能力&lt;/strong&gt;：通过对象层的抽象，实现了 UI 描述与具体渲染平台的解耦。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发范式转换&lt;/strong&gt;：将命令式的 DOM 操作转变为声明式的数据驱动，提升了复杂业务的可维护性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能兜底&lt;/strong&gt;：通过批处理和 Diff 算法，在不增加开发者负担的情况下，减少了不必要的真实 DOM 操作开销。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;研发效率&lt;/strong&gt;：让开发者专注于业务逻辑而非底层 DOM 树的增删改查，降低了出错概率。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在探讨 React 虚拟 DOM（Virtual DOM）所解决的问题时，不能简单地将其归结为“性能更快”，这实际上是一个常见的误区。&lt;/p&gt;
&lt;p&gt;从长期的工程实践和框架演进来看，虚拟 DOM 核心解决了以下几个维度的挑战：&lt;/p&gt;
&lt;h3 id="1-解决跨平台与抽象层的问题"&gt;1. 解决跨平台与抽象层的问题&lt;/h3&gt;
&lt;p&gt;虚拟 DOM 最本质的贡献在于建立了一层&lt;strong&gt;声明式的抽象&lt;/strong&gt;。在传统的 Web 开发中，代码直接耦合在真实的 DOM 环境中。而虚拟 DOM 将复杂的 UI 转换成了一种轻量级的 JavaScript 对象结构（即 VNode）。&lt;/p&gt;
&lt;p&gt;这种抽象层使得 React 脱离了浏览器的物理限制。因为 VNode 只是普通的 JS 对象，它不仅可以被渲染为浏览器的 DOM，也可以被渲染为移动端的原生控件（React Native）、服务端字符串（SSR）甚至是 Canvas 绘制指令。它解决了 UI 描述与底层渲染引擎之间的强耦合问题，实现了“一次学习，随处编写”的愿景。&lt;/p&gt;</description></item><item><title>京东-技术中台-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-27/round-30/</link><pubDate>Fri, 27 Jun 2025 05:48:05 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-27/round-30/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-27/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-27/round-31/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试深度考察JavaScript核心原理（闭包、继承实现）、前端框架（Vue响应式机制、虚拟DOM性能、Vue vs React区别）、性能优化（高并发请求处理、HTTP/2应用）、前端安全（XSS/CSRF防御）。难点聚焦于Vue响应式系统限制的解决（如动态字段更新）、复杂布局实现（自适应流式），以及高效算法设计（O(n)去重）。&lt;/p&gt;
&lt;p&gt;本轮共 14 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-12b75c445924"&gt;1. 自我介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;个人背景、能力、经验。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我叫[姓名]，毕业于[学校]，专业是[专业]。我有[X]年的前端开发经验，熟练掌握HTML、CSS、JavaScript等前端技术，熟悉Vue.js和React框架。在项目中，我注重代码质量和用户体验，善于解决复杂的技术问题。我曾参与过多个大型项目的开发，例如[项目名称]，负责[具体工作]，通过优化代码结构和性能，提升了页面加载速度和用户体验。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-48a8fe6d93f0"&gt;2. 怎么学习javascript的？讲一下闭包，自己的使用场景&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;JavaScript学习方法、闭包概念及应用。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;学习JavaScript时，我首先从基础语法入手，通过阅读经典书籍如《JavaScript高级程序设计》来系统地学习。闭包是JavaScript中的一个重要概念，它允许函数记住并访问其创建时所在的作用域链中的变量。闭包的使用场景很多，比如在事件处理中，可以使用闭包来保存事件相关的数据。例如，创建一个计数器函数，每次调用时返回当前的计数值，利用闭包可以保持计数器的状态。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-21144fa1-41b7-4077-97cd-b0c6030b10e0"&gt;3. Javascript如何实现继承？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/21144fa1-41b7-4077-97cd-b0c6030b10e0"&gt;Javascript如何实现继承？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;h2 id="1-原型链继承"&gt;1. 原型链继承&lt;/h2&gt;
&lt;p&gt;通过将一个构造函数的实例作为另一个构造函数的原型，实现属性和方法的继承。&lt;/p&gt;
&lt;h3 id="特点"&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;简单易实现。&lt;/li&gt;
&lt;li&gt;缺点是父类实例的属性会被所有子类实例共享。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-借用构造函数经典继承"&gt;2. 借用构造函数（经典继承）&lt;/h2&gt;
&lt;p&gt;通过在子类构造函数中调用父类构造函数，实现属性的继承。&lt;/p&gt;
&lt;h3 id="特点-1"&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;避免了原型链继承共享属性的问题。&lt;/li&gt;
&lt;li&gt;但无法继承父类的原型方法。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-组合继承原型链借用构造函数"&gt;3. 组合继承（原型链+借用构造函数）&lt;/h2&gt;
&lt;p&gt;结合原型链继承和借用构造函数的方法，既调用父类构造函数，又将父类原型赋值给子类原型。&lt;/p&gt;
&lt;h3 id="特点-2"&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;可以继承实例属性和原型方法。&lt;/li&gt;
&lt;li&gt;需要注意避免构造函数属性的多次调用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-原型式继承"&gt;4. 原型式继承&lt;/h2&gt;
&lt;p&gt;使用一个函数来创建一个新对象，并将这个新对象的原型指向另一个对象。&lt;/p&gt;
&lt;h3 id="特点-3"&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;适用于对象之间的属性继承，不涉及构造函数。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-寄生式继承"&gt;5. 寄生式继承&lt;/h2&gt;
&lt;p&gt;基于原型式继承，但添加了额外的包装函数，以提供更好的控制和灵活性。&lt;/p&gt;
&lt;h3 id="特点-4"&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通过创建对象的副本来实现继承，避免修改原始对象。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="6-es6-类继承"&gt;6. ES6 类继承&lt;/h2&gt;
&lt;p&gt;使用&lt;code&gt;class&lt;/code&gt;关键字和&lt;code&gt;extends&lt;/code&gt;关键字实现继承。&lt;/p&gt;
&lt;h3 id="特点-5"&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;语法简洁，易于理解。&lt;/li&gt;
&lt;li&gt;底层仍然是基于原型链实现。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一是什么"&gt;一、是什么&lt;/h2&gt;
&lt;p&gt;继承（inheritance）是面向对象软件技术当中的一个概念。&lt;/p&gt;
&lt;p&gt;如果一个类别B“继承自”另一个类别A，就把这个B称为“A的子类”，而把A称为“B的父类别”也可以称“A是B的超类”&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;继承的优点&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;继承可以使得子类具有父类别的各种属性和方法，而不需要再次编写相同的代码&lt;/p&gt;</description></item><item><title>京东-广告数据-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-26/round-29/</link><pubDate>Fri, 27 Jun 2025 05:46:50 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-26/round-29/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-26/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 考察核心集中在前端性能优化（如无限加载卡顿、页面渲染延迟）、CSS布局与兼容性（如Flexbox自适应、跨浏览器适配）及Vue框架原理（如响应式限制、虚拟DOM优劣）。需重点准备懒加载/虚拟滚动优化、兼容性Hack技巧、异步执行顺序分析及需求拆分设计能力。&lt;/p&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-1471ea7054ad"&gt;1. 现在我们有一个 618 活动页的需求，需要你来做，你会如何拆分需求，如何设计？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;需求分析与设计能力&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;ol&gt;
&lt;li&gt;首先与产品、设计、运营等多部门沟通，明确活动页的核心功能、促销规则、页面风格等基本需求。例如，确定活动主题（如限时秒杀、满减优惠等）、预计流量、商品展示形式等。&lt;/li&gt;
&lt;li&gt;根据功能模块拆分需求，可将活动页分为头部导航区（包含活动标题、时间、入口等信息）、商品展示区（如秒杀商品列表、热门推荐商品列表等）、促销信息区（展示活动规则、优惠券领取等）、底部信息区（如活动说明、客服入口等）。&lt;/li&gt;
&lt;li&gt;在设计上，根据品牌风格和活动主题确定整体视觉风格，包括配色方案（如节日氛围的红色、金色等）、字体选择、图片风格等。针对商品展示区，考虑采用网格布局或瀑布流布局，以合理展示商品信息，包括商品图片、名称、价格、优惠信息等。对于交互设计，需考虑页面的滚动加载、商品点击跳转、优惠券领取等交互效果，确保用户体验流畅。&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-f2b52b32bd5b"&gt;2. 商品列表中一行有五个商品卡片，最后一个自适应剩余空间，怎么实现。&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS 布局能力&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;可以使用 CSS 的 Flexbox 布局来实现。首先将商品列表的容器设置为 flex 布局，即 &lt;code&gt;display: flex&lt;/code&gt;。然后对前四个商品卡片设置固定宽度，例如 &lt;code&gt;width: 100px&lt;/code&gt;，最后一个商品卡片设置 &lt;code&gt;flex: 1&lt;/code&gt;，这样它就会占据所在行剩余的空间，实现自适应效果。同时，为了防止一行中商品卡片因内容过多而超出父容器宽度，可对每个商品卡片设置 &lt;code&gt;overflow: hidden&lt;/code&gt;，确保其内容在自身区域内显示，并且可以添加 &lt;code&gt;white - space: nowrap&lt;/code&gt; 和 &lt;code&gt;text - overflow: ellipsis&lt;/code&gt; 来处理溢出的文字内容。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-ebdcefd0ba4c"&gt;3. CSS 样式开发中你都遇到过哪些兼容性问题，如何解决的。&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS 问题解决能力及兼容性知识&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;ol&gt;
&lt;li&gt;在不同浏览器中遇到过盒模型问题，例如 IE 浏览器的怪异盒模型与其他浏览器的标准盒模型不同，导致元素尺寸计算不一致。解决方法是使用 &lt;code&gt;box - sizing: border - box&lt;/code&gt;，并结合 CSS 重置样式表统一各浏览器的盒模型表现。
2. 浮动布局在某些低版本浏览器中可能出现父元素高度塌陷或子元素排列不整齐的问题。可以通过为父元素添加 &lt;code&gt;clearfix&lt;/code&gt; 清除浮动，即设置父元素 &lt;code&gt;overflow: hidden&lt;/code&gt; 或使用伪元素 &lt;code&gt;:after&lt;/code&gt; 添加清除浮动的样式来解决。
3. CSS3 动画在部分浏览器中可能不支持，或者动画效果不一致。例如，IE 浏览器对 CSS3 动画的支持较弱。解决方法是使用渐进增强的方式，在支持 CSS3 动画的浏览器中展示动画效果，对于不支持的浏览器提供简单的过渡效果或静态样式，并利用Modernizr 等工具进行特性检测，根据检测结果加载相应的样式和脚本。
4. 字体渲染在不同操作系统和浏览器中可能存在差异，影响页面的美观和一致性。可以通过设置字体的 &lt;code&gt;font - family&lt;/code&gt; 为系统安全字体组合，并使用相对单位（如 &lt;code&gt;em&lt;/code&gt;、&lt;code&gt;rem&lt;/code&gt;）设置字体大小，以提高字体的兼容性和可读性。&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-99d5bcff8208"&gt;4. 你刚刚说的上滑无限加载有没有性能问题，你怎么解决？&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;前端性能优化知识&lt;/p&gt;</description></item><item><title>字节-飞书-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-25/round-27/</link><pubDate>Thu, 26 Jun 2025 08:23:26 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-25/round-27/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-25/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-25/round-28/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础知识和实际应用能力。&lt;/p&gt;
&lt;p&gt;本轮共 20 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-c7bf157863bd"&gt;1. 实现一个宽度自适应的搜索框。&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CSS布局能力：&lt;/strong&gt; 面试官希望确认候选人对CSS的布局方式（如Flexbox、Grid或传统布局）的掌握程度，以及如何实现元素的响应式和自适应。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计：&lt;/strong&gt; 考察候选人是否能考虑不同屏幕尺寸下的用户体验，并运用CSS媒体查询、视口单位等技术实现宽度自适应。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTML结构：&lt;/strong&gt; 确认候选人是否能编写语义化且结构清晰的HTML代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;宽度自适应的搜索框是指搜索框的宽度能够根据其父容器的宽度或视口宽度自动调整，以适应不同的屏幕尺寸和设备。实现这种效果通常依赖于CSS的弹性布局（Flexbox）或网格布局（Grid），结合相对单位（如百分比、vw/vh）或弹性单位（如flex属性）。其核心思想是让元素能够&amp;quot;伸缩自如&amp;quot;，而不是固定尺寸。&lt;/p&gt;
&lt;h5 id="12-核心用法--示例代码"&gt;1.2 核心用法 + 示例代码&lt;/h5&gt;
&lt;p&gt;以下是使用Flexbox实现宽度自适应搜索框的示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;search-container&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;search-input&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;请输入搜索内容&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;search-button&amp;#34;&lt;/span&gt;&amp;gt;搜索&amp;lt;/&lt;span style="color:#f92672"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;search-container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 占据父容器的全部宽度 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;max-width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;600&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 设置最大宽度，防止过宽 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;auto&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 居中显示 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;solid&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;#ccc&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;overflow&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;hidden&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 防止内容溢出 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;search-input&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;flex-grow&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 占据剩余空间 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;outline&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 移除聚焦时的边框 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;search-button&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#007bff&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;white&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;cursor&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;pointer&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;search-button&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;hover&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#0056b3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* 媒体查询，适应小屏幕 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#66d9ef"&gt;media&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#f92672"&gt;max-width&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#f92672"&gt;768px&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;search-container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;max-width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;场景说明：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>字节-本地生活-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-19/round-19/</link><pubDate>Tue, 24 Jun 2025 14:45:10 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-19/round-19/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-19/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-19/round-20/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本轮面试侧重考察候选人前端基础知识的系统掌握程度，包括 CSS 盒模型、选择器机制、ES6 语法、异步任务队列、响应式原理与网络协议等，同时会通过算法题考查思维能力与编码规范。&lt;/p&gt;
&lt;p&gt;重点关注以下几个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CSS布局与样式：考察对盒模型、选择器的深入理解，以及实际应用中的最佳实践&lt;/li&gt;
&lt;li&gt;JavaScript核心：重点关注ES6特性、闭包、异步编程等基础概念的掌握程度&lt;/li&gt;
&lt;li&gt;框架原理：主要考察Vue3响应式系统的实现原理与优化思路&lt;/li&gt;
&lt;li&gt;工程化思维：通过HTTP、缓存、性能优化等问题考察工程实践经验&lt;/li&gt;
&lt;li&gt;算法能力：通过字符串处理等典型题目考察基本编程功底&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本轮共 17 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-12b75c445924"&gt;1. 自我介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;这是一道主观性问题，没有标准答案。面试官主要考察：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;表达能力：语言组织、逻辑清晰度&lt;/li&gt;
&lt;li&gt;职业规划：技术深度、发展方向&lt;/li&gt;
&lt;li&gt;项目经验：技术栈匹配度、解决问题能力&lt;/li&gt;
&lt;li&gt;个人特质：学习能力、团队协作&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;&amp;ldquo;您好，我是XXX，有5年前端开发经验。毕业于XXX大学计算机科学专业，目前在一家互联网公司担任高级前端工程师。&lt;/p&gt;
&lt;p&gt;我擅长的技术栈是 Vue 和 React 生态，对前端工程化和性能优化有深入研究。最近两年主要负责公司的低代码平台建设，带领团队完成了从0到1的平台搭建。在这个项目中，我们解决了很多技术难题，比如大型JSON-Schema的渲染性能优化、自定义组件的实时预览等。通过这些优化，平台的页面渲染性能提升了60%，现在支持了超过100个业务团队的日常工作。&lt;/p&gt;
&lt;p&gt;在技术深度上，我特别关注前端框架底层原理，写过几篇关于Vue3响应式系统的技术文章，并给社区贡献过几个PR。同时我也在公司内部主导了前端性能监控体系的建设，建立了从采集、分析到报警的完整链路。&lt;/p&gt;
&lt;p&gt;选择字节跳动是因为被这里浓厚的技术氛围吸引，也认可公司在前端领域的技术实力。我希望能在更大的平台上，和优秀的团队一起解决更有挑战的问题。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;答题建议结构&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基本信息与技术栈&lt;/strong&gt;（15-20秒）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;教育背景&lt;/li&gt;
&lt;li&gt;工作年限&lt;/li&gt;
&lt;li&gt;技术栈概览&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;核心项目经历&lt;/strong&gt;（30-40秒）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1-2个最有代表性的项目&lt;/li&gt;
&lt;li&gt;突出个人贡献和技术难点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;技术深度展示&lt;/strong&gt;（20-30秒）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;专注的技术领域&lt;/li&gt;
&lt;li&gt;技术产出或开源贡献&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;职业规划&lt;/strong&gt;（10-15秒）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对岗位的理解&lt;/li&gt;
&lt;li&gt;个人发展诉求&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;答题要点提示&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;时间控制在90秒左右&lt;/li&gt;
&lt;li&gt;按照时间重要性安排内容比重&lt;/li&gt;
&lt;li&gt;突出个人特色，避免平铺直述&lt;/li&gt;
&lt;li&gt;适度准备，保持自然流畅&lt;/li&gt;
&lt;li&gt;结合岗位特点，突出匹配度&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-45ad807cb4c3"&gt;2. 标准盒模型与IE盒模型的区别，如何通过CSS切换两种模型？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;考察对CSS盒模型的深入理解，包括两种盒模型的区别、计算方式及其对布局的影响。同时也考察在工程实践中如何合理使用box-sizing，以及不同盒模型在响应式布局中的应用场景和性能影响。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;两种盒模型的区别&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;标准盒模型 (content-box)&lt;/strong&gt;：
• &lt;code&gt;width/height&lt;/code&gt; 仅包含内容区域
• 实际占用空间 = width + padding + border + margin
• 优点：精确控制内容区域大小
• 缺点：需要额外计算实际占用空间&lt;/p&gt;</description></item></channel></rss>