<?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/%E6%8A%80%E6%9C%AF%E9%9D%A2%E8%AF%95/</link><description>Recent content in 技术面试 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 01 Feb 2026 14:42:25 +0000</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E6%8A%80%E6%9C%AF%E9%9D%A2%E8%AF%95/index.xml" rel="self" type="application/rss+xml"/><item><title>小红书-社招-5年 · 第 1 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-159/</link><pubDate>Sun, 01 Feb 2026 14:42:25 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-159/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-160/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 该轮面试主要考察了前端基础知识，包括BFC、浮动元素、作用域、异步编程、Webpack、Vue等多方面的内容。题目涉及理论知识和代码实现。&lt;/p&gt;
&lt;p&gt;本轮共 18 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-5c174882-c1e7-4c08-a71a-f4c991be552f"&gt;1. BFC讲一下&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/5c174882-c1e7-4c08-a71a-f4c991be552f"&gt;什么是BFC？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;BFC（Block Formatting Context）&lt;/strong&gt; 是 CSS 中一个重要的布局概念，它描述了一个块级元素的内部布局和外部布局之间的关系。BFC 主要用于处理元素的布局、浮动、边距合并等问题。&lt;/p&gt;
&lt;h3 id="bfc-的作用"&gt;BFC 的作用&lt;/h3&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;：当两个块级元素垂直相邻时，它们的外边距会合并，形成一个更大的外边距。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BFC&lt;/strong&gt;：在 BFC 内部的元素的外边距不会影响到外部 BFC 的元素，避免了外边距折叠的问题。&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;BFC&lt;/strong&gt;：具有 BFC 的元素可以包含其内部的浮动元素，确保其高度包括浮动元素的高度。&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;BFC&lt;/strong&gt;：在 BFC 内部，元素的布局（如浮动、定位）会受到影响和控制，避免与外部元素发生冲突。&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;BFC&lt;/strong&gt;：能够隔离不同的 BFC 区域，避免元素之间的重叠或干扰。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="如何触发-bfc"&gt;如何触发 BFC&lt;/h3&gt;
&lt;p&gt;BFC 会在以下情况中被触发：&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;code&gt;display&lt;/code&gt; 属性值为 &lt;code&gt;block&lt;/code&gt; 或 &lt;code&gt;inline-block&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;元素的 &lt;code&gt;position&lt;/code&gt; 属性值为 &lt;code&gt;absolute&lt;/code&gt; 或 &lt;code&gt;fixed&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;元素的 &lt;code&gt;float&lt;/code&gt; 属性值为 &lt;code&gt;left&lt;/code&gt; 或 &lt;code&gt;right&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;元素的 &lt;code&gt;overflow&lt;/code&gt; 属性值为 &lt;code&gt;hidden&lt;/code&gt;、&lt;code&gt;scroll&lt;/code&gt; 或 &lt;code&gt;auto&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;</description></item><item><title>小红书-社招-3年 · 第 1 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-156/</link><pubDate>Sun, 01 Feb 2026 14:42:08 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-156/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-157/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了前端基础知识，包括JavaScript的基本类型和引用类型的存储、闭包的内存泄漏、垃圾回收机制、事件循环、React框架的理解等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; Promise、CDN原理、Class、数据类型、浏览器渲染过程&lt;/p&gt;
&lt;p&gt;本轮共 24 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-ae4aa03a-06fe-41be-9c42-f53947f13f49"&gt;1. js中基本类型 和 引用类型的存储有什么不一样&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/ae4aa03a-06fe-41be-9c42-f53947f13f49"&gt;引用类型有哪些，有什么特点&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&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;p&gt;在JavaScript中，引用类型是指非基本数据类型，它们是由对象、数组、函数等复杂数据结构组成的。&lt;/p&gt;
&lt;p&gt;常见的引用类型包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;对象（Object）&lt;/code&gt;：对象是JavaScript中最基本的引用类型，它可以用来存储键值对，也可以通过原型链实现继承。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;数组（Array）&lt;/code&gt;：数组是一种有序的集合，可以存储任意类型的数据，它的长度是动态的，可以随时添加或删除元素。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;函数（Function）&lt;/code&gt;：函数是一种可执行的对象，可以封装一段可重复使用的代码。函数可以接收参数并返回值。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;引用类型的特点包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;引用类型的值是可变的：引用类型的值是存储在堆内存中的，当我们修改一个引用类型的值时，实际上是修改了它在内存中的地址，而不是修改了该值本身。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;引用类型值的比较是引用的比较：当使用&amp;quot;==&amp;ldquo;或&amp;rdquo;===&amp;ldquo;运算符比较两个引用类型的值时，它们会进行引用的比较，即判断它们是否指向同一个内存地址。只有当两个引用指向同一个对象时，它们才被认为是相等的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;引用类型可以有自己的属性和方法：引用类型的值可以拥有自己的属性和方法。例如，数组对象有长度属性和一些常用的数组方法（例如push、pop、sort等），而函数对象有call、apply等方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;引用类型可以通过原型链实现继承：通过原型链，引用类型可以继承父类型的属性和方法。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基本类型（如数字、字符串、布尔值）在JavaScript中是按值传递的，而引用类型是按引用传递的。&lt;/p&gt;
&lt;p&gt;这意味着当将一个引用类型的值赋给另一个变量时，实际上是将内存地址复制给了新的变量，两个变量引用的是同一对象。而基本类型的值赋给另一个变量时，会创建一个新的值并赋给新的变量。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-6dd983d9-39fc-48ca-9e22-7599ab339f5b"&gt;2. 闭包的内存泄漏应该如何监控和解决？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/6dd983d9-39fc-48ca-9e22-7599ab339f5b"&gt;如何检查Javascript中的内存泄漏？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Chrome 浏览器查看内存占用，按照以下步骤操作。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="浏览器"&gt;浏览器&lt;/h2&gt;
&lt;p&gt;Chrome 浏览器查看内存占用，按照以下步骤操作。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image.png" loading="lazy" src="https://static.ecool.fun//article/b822300b-cf04-4c9f-9d88-06bd331726c0.png"&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-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1、打开开发者工具，选择 Timeline 面板
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2、在顶部的Capture字段里面勾选 Memory
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3、点击左上角的录制按钮。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4、在页面上进行各种操作，模拟用户的使用情况。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5、一段时间后，点击对话框的 stop 按钮，面板上就会显示这段时间的内存占用情况。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果内存占用基本平稳，接近水平，就说明不存在内存泄漏。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image.png" loading="lazy" src="https://static.ecool.fun//article/5b616638-2dbc-49a7-9bde-97271ec206b1.png"&gt;&lt;/p&gt;
&lt;p&gt;反之，就是内存泄漏了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image.png" loading="lazy" src="https://static.ecool.fun//article/a05a6942-5cbe-42c8-a213-9122a9a851db.png"&gt;&lt;/p&gt;
&lt;h2 id="命令行"&gt;命令行&lt;/h2&gt;
&lt;p&gt;命令行可以使用 Node 提供的process.memoryUsage方法。&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:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;process&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;memoryUsage&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// { rss: 27709440,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// heapTotal: 5685248,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// heapUsed: 3449392,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// external: 8772 }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;process.memoryUsage返回一个对象，包含了 Node 进程的内存占用信息。该对象包含四个字段，单位是字节，含义如下。&lt;/p&gt;</description></item><item><title>小红书-社招-1年 · 第 1 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-154/</link><pubDate>Sun, 01 Feb 2026 14:40:35 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-154/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-155/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了前端技术栈的深度和广度，包括CSS框架、响应式设计、渲染优化、Vue框架的高级特性、HTTP协议、浏览器渲染机制等方面的知识。&lt;/p&gt;
&lt;p&gt;本轮共 22 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-aa8173c10147"&gt;1. 项目中为何选择 Tailwind CSS ？&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;Tailwind CSS 是一个高度可定制的低级 CSS 框架，它提供了大量的原子类，可以快速构建一致且响应式的布局。选择 Tailwind CSS 的原因可能包括其灵活性、可维护性以及与现代前端工具链的良好集成。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-fa06c194-9fab-4cf0-8cc7-dda90c2c4f97"&gt;2. Tailwind 是怎么解决样式冲突的？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/fa06c194-9fab-4cf0-8cc7-dda90c2c4f97"&gt;Tailwind 是怎么解决样式冲突的？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Tailwind 通过原子化 utility 类、统一选择器权重、避免层级嵌套、构建期生成样式以及可预测的覆盖规则，从架构层面降低样式冲突的发生概率。它不是依赖命名规范解决冲突，而是通过设计约束和单一职责类模型，使样式天然解耦，从而让冲突可控且可预测。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;这个问题如果只回答“因为类名不会冲突”是远远不够的。&lt;/p&gt;
&lt;p&gt;Tailwind 解决样式冲突，本质上是通过 &lt;strong&gt;设计约束 + 原子化模型 + 构建期生成策略&lt;/strong&gt;，从源头消除冲突的产生条件，而不是事后避免覆盖。&lt;/p&gt;
&lt;p&gt;下面从机制层面拆解。&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="一传统-css-为什么容易冲突"&gt;一、传统 CSS 为什么容易冲突&lt;/h1&gt;
&lt;p&gt;传统样式冲突来自三个方面：&lt;/p&gt;
&lt;h3 id="1-选择器冲突"&gt;1. 选择器冲突&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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;btn&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;red&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;button&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;blue&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不同模块命名不规范会互相覆盖。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="2-层级嵌套带来的权重问题"&gt;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-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;page&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;btn&lt;/span&gt; { &lt;span style="color:#960050;background-color:#1e0010"&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;
&lt;hr&gt;
&lt;h3 id="3-样式全局污染"&gt;3. 样式全局污染&lt;/h3&gt;
&lt;p&gt;CSS 默认是全局作用域，没有隔离边界。&lt;/p&gt;</description></item><item><title>360-实习 · 第 1 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-83/round-132/</link><pubDate>Sat, 31 Jan 2026 09:54:14 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-83/round-132/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-83/"&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; 45分钟&lt;/p&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&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;自我介绍应包括个人背景、工作经验、技术栈、项目经验和对未来的展望。重点在于展示自己的专业能力和对前端技术的热情。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-74d4b354dd42"&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-cd57a5aa-c239-4cb2-b2b5-d0d6a49f80f3"&gt;3. 讲一个你参与过的项目&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/cd57a5aa-c239-4cb2-b2b5-d0d6a49f80f3"&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;h3 id="1-项目架构"&gt;&lt;strong&gt;1. 项目架构&lt;/strong&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;：统一代码风格和规范，使用 ESLint、Prettier 等工具进行代码检查和格式化。&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;h3 id="2-构建工具和配置"&gt;&lt;strong&gt;2. 构建工具和配置&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;构建工具&lt;/strong&gt;：使用工具如 Webpack、Vite、Rollup 等进行项目的构建和打包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置管理&lt;/strong&gt;：配置构建工具以支持各种功能，如代码分割、热重载、环境变量等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优化&lt;/strong&gt;：配置代码压缩、缓存策略、Tree Shaking 等，提升构建产物的性能和效率。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-开发环境"&gt;&lt;strong&gt;3. 开发环境&lt;/strong&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;/ul&gt;
&lt;h3 id="4-包管理"&gt;&lt;strong&gt;4. 包管理&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;依赖管理&lt;/strong&gt;：使用 npm、Yarn 或 pnpm 等工具管理项目依赖，确保依赖版本一致性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发布管理&lt;/strong&gt;：管理和发布自定义的 npm 包或组件库。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-自动化流程"&gt;&lt;strong&gt;5. 自动化流程&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CI/CD&lt;/strong&gt;：配置持续集成（CI）和持续部署（CD）流程，自动化构建、测试和部署。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试&lt;/strong&gt;：集成单元测试、集成测试和端到端测试工具，如 Jest、Cypress 等，确保代码质量。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-代码质量"&gt;&lt;strong&gt;6. 代码质量&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静态分析&lt;/strong&gt;：使用 ESLint、TSLint 等工具进行代码静态检查。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试覆盖率&lt;/strong&gt;：监控测试覆盖率，确保关键代码路径被充分测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="7-文档"&gt;&lt;strong&gt;7. 文档&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;代码文档&lt;/strong&gt;：编写和维护项目文档，包括 API 文档、开发指南和使用说明。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动化文档生成&lt;/strong&gt;：使用工具如 Storybook、JSDoc 等生成组件库和 API 文档。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="8-组件库"&gt;&lt;strong&gt;8. 组件库&lt;/strong&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;/ul&gt;
&lt;h3 id="9-性能优化"&gt;&lt;strong&gt;9. 性能优化&lt;/strong&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;/ul&gt;
&lt;h3 id="10-安全"&gt;&lt;strong&gt;10. 安全&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;安全最佳实践&lt;/strong&gt;：遵循前端安全最佳实践，如防范 XSS 和 CSRF 攻击。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;敏感数据保护&lt;/strong&gt;：确保敏感数据不被暴露或滥用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-2a354c037923"&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-82/round-131/</link><pubDate>Sat, 31 Jan 2026 09:19:52 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-82/round-131/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-82/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 该轮主要考察前端基础知识、JavaScript高级特性、HTTP协议、Vue与React框架对比、Git操作以及算法实现能力。问题涵盖理论理解与实际应用，氛围较为专业。&lt;/p&gt;
&lt;p&gt;本轮共 16 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-25a1d366-42f6-42e2-9a41-b6dd4624fd55"&gt;1. 如何判断一个变量是数组？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/25a1d366-42f6-42e2-9a41-b6dd4624fd55"&gt;判断数组的方式有哪些？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐方法&lt;/strong&gt;：使用 &lt;code&gt;Array.isArray()&lt;/code&gt;，这是最简单、最可靠的方式来检查一个值是否为数组。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;其他方法&lt;/strong&gt;：&lt;code&gt;instanceof&lt;/code&gt; 和 &lt;code&gt;Object.prototype.toString.call()&lt;/code&gt; 也很有效，但有一些特定的局限性。&lt;code&gt;constructor&lt;/code&gt; 和 &lt;code&gt;isPrototypeOf()&lt;/code&gt; 方法不如 &lt;code&gt;Array.isArray()&lt;/code&gt; 可靠，且在某些情况下可能会出现问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;判断一个值是否为数组的方式有多种：&lt;/p&gt;
&lt;h3 id="1-arrayisarray"&gt;1. &lt;strong&gt;&lt;code&gt;Array.isArray()&lt;/code&gt; 方法&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;：这是 ES5 引入的标准方法，推荐用于检查一个值是否为数组。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：&lt;code&gt;Array.isArray(value)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&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:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(Array.&lt;span style="color:#a6e22e"&gt;isArray&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:#75715e"&gt;// true
&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;(Array.&lt;span style="color:#a6e22e"&gt;isArray&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-instanceof"&gt;2. &lt;strong&gt;&lt;code&gt;instanceof&lt;/code&gt; 操作符&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;：使用 &lt;code&gt;instanceof&lt;/code&gt; 操作符来判断对象是否是 &lt;code&gt;Array&lt;/code&gt; 的实例。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：&lt;code&gt;value instanceof Array&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&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:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&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:#66d9ef"&gt;instanceof&lt;/span&gt; Array); &lt;span style="color:#75715e"&gt;// true
&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;hello&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;instanceof&lt;/span&gt; Array); &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-objectprototypetostringcall"&gt;3. &lt;strong&gt;&lt;code&gt;Object.prototype.toString.call()&lt;/code&gt; 方法&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;：使用 &lt;code&gt;Object.prototype.toString.call()&lt;/code&gt; 可以准确判断一个对象的类型，包括数组。它返回 &lt;code&gt;[object Array]&lt;/code&gt; 对于数组，其他类型则返回不同的结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：&lt;code&gt;Object.prototype.toString.call(value)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&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:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(Object.&lt;span style="color:#a6e22e"&gt;prototype&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;call&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:#75715e"&gt;// [object Array]
&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;(Object.&lt;span style="color:#a6e22e"&gt;prototype&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;call&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// [object String]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-constructor"&gt;4. &lt;strong&gt;&lt;code&gt;constructor&lt;/code&gt; 属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;：检查 &lt;code&gt;constructor&lt;/code&gt; 属性是否为 &lt;code&gt;Array&lt;/code&gt;。这种方法不如 &lt;code&gt;Array.isArray()&lt;/code&gt; 可靠，因为 &lt;code&gt;constructor&lt;/code&gt; 可以被改变。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：&lt;code&gt;value.constructor === Array&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&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:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&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:#a6e22e"&gt;constructor&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; Array); &lt;span style="color:#75715e"&gt;// true
&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;hello&amp;#39;&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;constructor&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; Array); &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-arrayprototypeisprototypeof"&gt;5. &lt;strong&gt;&lt;code&gt;Array.prototype.isPrototypeOf()&lt;/code&gt; 方法&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;：检查数组的 &lt;code&gt;prototype&lt;/code&gt; 是否在目标对象的 &lt;code&gt;prototype&lt;/code&gt; 链上。这种方法也可以用来判断一个对象是否为数组。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：&lt;code&gt;Array.prototype.isPrototypeOf(value)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&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:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(Array.&lt;span style="color:#a6e22e"&gt;prototype&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;isPrototypeOf&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:#75715e"&gt;// true
&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;(Array.&lt;span style="color:#a6e22e"&gt;prototype&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;isPrototypeOf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-使用"&gt;6. &lt;strong&gt;使用 &lt;code&gt;constructor&lt;/code&gt; 属性和原型链&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;：结合 &lt;code&gt;constructor&lt;/code&gt; 属性和原型链检查。这个方法有一定的局限性，不推荐使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&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;isArray&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 style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;typeof&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;object&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;constructor&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; Array;
&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;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;isArray&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:#75715e"&gt;// true
&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;isArray&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-9627e396b5fc"&gt;2. 讲一下闭包及其优缺点。&lt;/h2&gt;
&lt;h3 id="题目要点-1"&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-81/round-130/</link><pubDate>Sat, 31 Jan 2026 09:19:33 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-81/round-130/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-81/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 该轮主要考察前端开发相关知识，包括动画实现、性能优化、React优化、Web Accessibility、计时器处理、WebSocket、缓存策略、国际化、兼容性问题等。题目以主观题为主，注重对核心原理和实际应用场景的理解。&lt;/p&gt;
&lt;p&gt;本轮共 18 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-c97dc39dce4b"&gt;1. 实现一个动画，当用户鼠标悬停在按钮上时，按钮逐渐变大&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS transition, 动画性能优化, 硬件加速, 事件监听&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在实现此类动画时，可以使用CSS的transition属性或JavaScript的requestAnimationFrame方法。重点在于控制动画的流畅性和性能。可以通过设置合适的过渡时间（transition-duration）和使用硬件加速（如transform: scale()）来提升性能。此外，注意避免不必要的重排和重绘，确保动画的平滑性。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-5adab921-8dfb-4a65-9f44-38ae8a70820f"&gt;2. 如何避免动画过程中的卡顿？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/5adab921-8dfb-4a65-9f44-38ae8a70820f"&gt;在解决动画卡顿问题时，会引导硬件加速，那么硬件加速的原理是什么？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;硬件加速是指利用 GPU（图形处理单元）来执行图形和动画相关的计算任务，以减轻 CPU（中央处理单元）的负担。GPU 专为处理图形和图像的高吞吐量操作而设计，因此在执行动画和复杂图形渲染时，硬件加速可以提供更流畅的体验。&lt;/p&gt;
&lt;h4 id="原理解析"&gt;原理解析&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GPU vs CPU&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GPU 拥有更多的核心，适合并行处理大量计算任务，而 CPU 核心较少，更适合串行处理复杂逻辑。&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;GPU 优化了图形渲染流程，包括顶点处理、像素着色等，这些是动画和图形显示的基础。&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;通过硬件加速，可以减少浏览器的重绘（repaint）和回流（reflow）次数，这些操作通常由 DOM 变更触发，非常消耗性能。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;合成层（Compositing Layer）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览器使用合成层来合并多个层的图形，GPU 可以快速地在这些层上进行变换和动画。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSS 属性触发&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;某些 CSS 属性，如 &lt;code&gt;transform&lt;/code&gt; 的 3D 变换（&lt;code&gt;translate3d&lt;/code&gt;、&lt;code&gt;scale3d&lt;/code&gt; 等）和 &lt;code&gt;opacity&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="考察重点"&gt;考察重点&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;理解：硬件加速的基本概念和 GPU 在图形渲染中的作用。&lt;/li&gt;
&lt;li&gt;应用：知道哪些 CSS 属性可以触发硬件加速，以及如何利用它们来优化动画性能。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;面试中可能会经常会碰到怎么解决动画卡顿的问题，然后会引导到硬件加速。那么究竟什么是硬件加速，为什么它可以提高咱们的动画效率？我们今天就来一探究竟。&lt;/p&gt;</description></item><item><title>小红书-社招-5年 · 第 2 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-160/</link><pubDate>Sun, 01 Feb 2026 14:42:25 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-160/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-159/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 该轮面试主要考察了浏览器的工作原理、缓存策略、跨域、Vue生命周期、组件通信等方面的知识。题目涉及理论知识和实际应用场景。&lt;/p&gt;
&lt;p&gt;本轮共 14 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-5def10e9-7825-4bd4-a76e-6d7eb555a2ce"&gt;1. 详细讲一下从url输入网址到页面渲染的过程&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/5def10e9-7825-4bd4-a76e-6d7eb555a2ce"&gt;简单描述从输入网址到页面显示的过程&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;当输入URL到页面加载完成，发生了以下几个关键过程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DNS解析&lt;/strong&gt;：浏览器将URL解析为对应的IP地址。这个过程涉及多级DNS服务器，从本地缓存开始，如果没有找到，则递归查询根域名服务器、顶级域名服务器，直到找到目标服务器的IP地址。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TCP连接&lt;/strong&gt;：浏览器通过三次握手与服务器建立TCP连接。一旦连接建立，浏览器可以发送HTTP请求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP请求&lt;/strong&gt;：浏览器构建HTTP请求报文，通过TCP连接发送到服务器。请求报文包含请求行、请求头和请求正文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务器处理请求&lt;/strong&gt;：服务器接收HTTP请求，解析请求内容，执行相应的处理（如数据库查询、文件读取等），并构建HTTP响应报文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP响应&lt;/strong&gt;：服务器将响应报文通过TCP连接发送回浏览器。响应报文包含状态码、响应头和响应正文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;浏览器解析渲染&lt;/strong&gt;：浏览器接收到HTTP响应后，解析HTML文档构建DOM树，解析CSS构建CSSOM树，合并两者形成渲染树，然后开始渲染页面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接结束&lt;/strong&gt;：当浏览器完成页面渲染或收到服务器关闭连接的信号时，浏览器会发送TCP连接关闭的信号，服务器收到后，双方断开连接。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;很多大公司面试喜欢问这样一道面试题，输入URL到看见页面发生了什么？&lt;/p&gt;
&lt;p&gt;简单来说，共有以下几个过程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS解析&lt;/li&gt;
&lt;li&gt;发起TCP连接&lt;/li&gt;
&lt;li&gt;发送HTTP请求&lt;/li&gt;
&lt;li&gt;服务器处理请求并返回HTTP报文&lt;/li&gt;
&lt;li&gt;浏览器解析渲染页面&lt;/li&gt;
&lt;li&gt;连接结束&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面我们来看看具体的细节。&lt;/p&gt;
&lt;h2 id="dns解析"&gt;DNS解析&lt;/h2&gt;
&lt;p&gt;DNS解析实际上就是寻找你所需要的资源的过程。假设你输入&lt;code&gt;www.baidu.com&lt;/code&gt;，而这个网址并不是百度的真实地址，互联网中每一台机器都有唯一标识的IP地址，这个才是关键，但是它不好记，乱七八糟一串数字谁记得住啊，所以就需要一个网址和IP地址的转换，也就是DNS解析。&lt;/p&gt;
&lt;p&gt;DNS解析其实是一个递归的过程。&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;www.google.com&lt;/code&gt;网址后，首先在本地的域名服务器中查找，没找到去根域名服务器查找，没有再去com顶级域名服务器查找，，如此的类推下去，直到找到IP地址，然后把它记录在本地，供下次使用。大致过程就是.-&amp;gt; .com -&amp;gt;google.com. -&amp;gt; &lt;a href="https://www.google.com"&gt;www.google.com&lt;/a&gt;.。 (最后这个.对应的就是根域名服务器，默认情况下所有的网址的最后一位都是.，为了方便用户，通常都会省略，浏览器在请求DNS的时候会自动加上)&lt;/p&gt;
&lt;h3 id="dns优化"&gt;DNS优化&lt;/h3&gt;
&lt;p&gt;既然已经懂得了解析的具体过程，我们可以看到上述一共经过了N个过程，每个过程有一定的消耗和时间的等待，因此我们得想办法解决一下这个问题！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS缓存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DNS存在着多级缓存，从离浏览器的距离排序的话，有以下几种: 浏览器缓存，系统缓存，路由器缓存，ISP服务器缓存，根域名服务器缓存，顶级域名服务器缓存，主域名服务器缓存。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS负载均衡&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;比如访问baidu.com的时候，每次响应的并非是同一个服务器（IP地址不同），一般大公司都有成百上千台服务器来支撑访问。DNS可以返回一个合适的机器的IP给用户，例如可以根据每台机器的负载量，该机器离用户地理位置的距离等等，这种过程就是DNS负载均衡。&lt;/p&gt;
&lt;h2 id="发起tcp连接"&gt;发起TCP连接&lt;/h2&gt;
&lt;p&gt;TCP提供一种可靠的传输，这个过程涉及到三次握手，四次挥手。&lt;/p&gt;
&lt;h3 id="三次握手"&gt;三次握手&lt;/h3&gt;
&lt;p&gt;&lt;img alt="三次握手示意图" loading="lazy" src="https://static.ecool.fun//article/f3f07532-8a7f-48f8-8f9e-d68ac149f9a2.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一次握手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;客户端发送syn包(Seq=x)到服务器，并进入SYN_SEND状态，等待服务器确认；&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第二次握手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;服务器收到syn包，必须确认客户的SYN（ack=x+1），同时自己也发送一个SYN包（Seq=y），即SYN+ACK包，此时服务器进入SYN_RECV状态；&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第三次握手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;客户端收到服务器的SYN＋ACK包，向服务器发送确认包ACK(ack=y+1)，此包发送完毕，客户端和服务器进入ESTABLISHED状态，完成三次握手。&lt;/p&gt;
&lt;p&gt;握手过程中传送的包里不包含数据，三次握手完毕后，客户端与服务器才正式开始传送数据。理想状态下，TCP连接一旦建立，在通信双方中的任何一方主动关闭连接之前，TCP 连接都将被一直保持下去。&lt;/p&gt;
&lt;h3 id="四次挥手"&gt;四次挥手&lt;/h3&gt;
&lt;p&gt;数据传输完毕后，双方都可释放连接。最开始的时候，客户端和服务器都是处于ESTABLISHED状态，假设客户端主动关闭，服务器被动关闭。&lt;/p&gt;
&lt;p&gt;&lt;img alt="四次挥手示意图" loading="lazy" src="https://static.ecool.fun//article/dbf0912c-a6df-48d0-8981-7224eae4492f.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一次挥手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;客户端发送一个FIN，用来关闭客户端到服务器的数据传送，也就是客户端告诉服务器：我已经不 会再给你发数据了(当然，在fin包之前发送出去的数据，如果没有收到对应的ack确认报文，客户端依然会重发这些数据)，但是，此时客户端还可以接受数据。&lt;/p&gt;
&lt;p&gt;FIN=1，其序列号为seq=u（等于前面已经传送过来的数据的最后一个字节的序号加1），此时，客户端进入FIN-WAIT-1（终止等待1）状态。 TCP规定，FIN报文段即使不携带数据，也要消耗一个序号。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第二次挥手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;服务器收到FIN包后，发送一个ACK给对方并且带上自己的序列号seq，确认序号为收到序号+1（与SYN相同，一个FIN占用一个序号）。此时，服务端就进入了CLOSE-WAIT（关闭等待）状态。TCP服务器通知高层的应用进程，客户端向服务器的方向就释放了，这时候处于半关闭状态，即客户端已经没有数据要发送了，但是服务器若发送数据，客户端依然要接受。这个状态还要持续一段时间，也就是整个CLOSE-WAIT状态持续的时间。&lt;/p&gt;</description></item><item><title>小红书-社招-3年 · 第 2 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-157/</link><pubDate>Sun, 01 Feb 2026 14:42:08 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-157/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-156/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-158/"&gt;第 3 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了小程序的性能优化、核心监控指标、首屏时间的计算、业务价值验证、高频事件处理等方面的知识。&lt;/p&gt;
&lt;p&gt;本轮共 11 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-92e09b66-a9fc-435d-ad28-99011b2ddeaa"&gt;1. 小程序性能优化做了哪些事情？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/92e09b66-a9fc-435d-ad28-99011b2ddeaa"&gt;小程序可以做哪些性能优化？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;小程序性能优化围绕逻辑层与视图层分离架构展开，重点是减少 setData 频率与数据体积，控制列表节点数量，优化首包体积与启动链路，并通过分包加载、WXS 与懒加载等手段降低渲染压力。核心原则是减少跨线程通信与避免无意义重渲染，从架构层面解决性能瓶颈。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;小程序的性能优化，不能只从“前端渲染”角度看。它的运行模型和 Web 不同，存在 &lt;strong&gt;逻辑层（JSCore）与视图层（WebView）分离&lt;/strong&gt; 的架构特征，核心瓶颈往往出在：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;跨线程通信成本&lt;/li&gt;
&lt;li&gt;setData 传输体积&lt;/li&gt;
&lt;li&gt;渲染节点数量&lt;/li&gt;
&lt;li&gt;包体与启动链路&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;优化必须围绕这些机制展开。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一理解运行架构是前提"&gt;一、理解运行架构是前提&lt;/h2&gt;
&lt;p&gt;以 微信小程序 为例：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;逻辑层：JS 执行环境&lt;/li&gt;
&lt;li&gt;视图层：WebView 渲染&lt;/li&gt;
&lt;li&gt;两层通过 JSON 序列化通信&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每一次 &lt;code&gt;setData&lt;/code&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数据序列化&lt;/li&gt;
&lt;li&gt;线程间传输&lt;/li&gt;
&lt;li&gt;视图层 diff&lt;/li&gt;
&lt;li&gt;真实节点更新&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以小程序性能优化的第一原则是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;减少跨线程通信的数据量与次数。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="二控制-setdata-的粒度与频率"&gt;二、控制 setData 的粒度与频率&lt;/h2&gt;
&lt;h3 id="1-避免大对象全量更新"&gt;1. 避免大对象全量更新&lt;/h3&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;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setData&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;form&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newFormObject&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;如果 form 很大，每次都会整体传输。&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;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setData&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;form.username&amp;#34;&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用路径更新，最小化数据传输。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="2-合并多次-setdata"&gt;2. 合并多次 setData&lt;/h3&gt;
&lt;p&gt;多次调用：&lt;/p&gt;</description></item><item><title>小红书-社招-1年 · 第 2 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-155/</link><pubDate>Sun, 01 Feb 2026 14:40:35 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-155/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-154/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了项目经验和技术选型，包括Vue3+TS的选择理由、UI框架的优势、TypeScript的应用、组件化方案、Canvas离屏渲染、Service Worker等内容。&lt;/p&gt;
&lt;p&gt;本轮共 14 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-5e97f1f58c95"&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-46188abebbf3"&gt;2. 项目为什么选择Vue3+TS而非React&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Vue3 + TypeScript 的选择通常基于团队技术栈一致性、Composition API 带来的逻辑复用能力、与 TypeScript 的良好类型推导，以及在中后台场景中更成熟的生态和更低的工程复杂度，从而提升整体开发效率与可维护性。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在技术选型阶段通常会综合考虑团队技术栈、项目复杂度以及开发效率等因素。对于以中后台系统或业务管理平台为主的项目，Vue3 在整体开发体验和约束能力上往往更容易形成统一规范。&lt;/p&gt;
&lt;p&gt;首先是框架设计层面的差异。Vue3 通过 Composition API 将逻辑拆分为可组合的函数单元，在复杂业务场景下可以很好地解决 Options API 中逻辑分散的问题，同时又保留了模板语法，使得结构、逻辑、样式之间的职责划分更加清晰。对于需要长期维护的业务项目，这种组织方式通常更容易理解和维护。&lt;/p&gt;
&lt;p&gt;其次是 TypeScript 的结合程度。Vue3 在框架层面对 TypeScript 做了较深的适配，例如 &lt;code&gt;defineComponent&lt;/code&gt;、&lt;code&gt;setup&lt;/code&gt;、&lt;code&gt;ref&lt;/code&gt;、&lt;code&gt;reactive&lt;/code&gt; 等 API 都有较完整的类型推导能力，配合 &lt;code&gt;&amp;amp;lt;script setup&amp;amp;gt;&lt;/code&gt; 可以获得较好的类型提示和开发体验。在大型项目中，类型系统能够帮助提前暴露接口契约问题，提高代码的可维护性。&lt;/p&gt;
&lt;p&gt;另外在生态与工程效率方面，Vue3 在国内中后台领域的组件生态较成熟，例如组件库、低代码平台以及相关工具链都比较完善，能够快速搭建业务系统。对于团队成员技术背景主要偏 Vue 的情况下，可以降低学习成本和沟通成本，提高整体开发效率。&lt;/p&gt;
&lt;p&gt;从工程复杂度角度看，React 在灵活性上更强，但很多能力需要通过生态组合实现，例如状态管理、表单方案等，需要额外制定规范。Vue3 本身提供了较完整的开发范式，在团队规模较大的情况下更容易形成统一的代码风格。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-6d85386cc446"&gt;3. NutUI在营销活动中相比其他UI框架有什么优势&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;移动端, 轻量, 高性能, 易于使用, 组件库, 用户体验, 开发效率, 按需加载, 应用体积&lt;/p&gt;</description></item><item><title>小红书-社招-3年 · 第 3 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-158/</link><pubDate>Sun, 01 Feb 2026 14:42:08 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-158/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-157/"&gt;第 2 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了小程序的低代码设计架构、Web Worker的使用、中台系统的微前端拆分策略等方面的知识。&lt;/p&gt;
&lt;p&gt;本轮共 4 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-002c3370fca7"&gt;1. 讲一下你关于小程序的低代码设计架构&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;小程序低代码架构本质是配置驱动的运行时体系，核心包括 DSL 协议设计、组件注册机制、运行时解析与数据驱动更新；必须围绕 setData 性能约束进行差量更新与渲染优化；工程重点不在编辑器，而在运行时引擎的性能治理与扩展能力设计。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;小程序的低代码架构，本质是在&lt;strong&gt;受限运行环境下实现“可配置驱动 UI 与逻辑”&lt;/strong&gt;。核心不是拖拽能力，而是如何让页面结构、交互逻辑、数据流都由配置驱动，同时保证性能与可维护性。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一整体架构分层"&gt;一、整体架构分层&lt;/h2&gt;
&lt;p&gt;小程序低代码一般分为四层：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;编辑层 → DSL 层 → 运行时引擎 → 渲染层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;编辑层负责产出结构化配置；DSL 层定义组件树与属性协议；运行时负责解析与调度；渲染层落在小程序原生组件体系之上（如 WXML + setData 机制，在 微信小程序 中即运行于其渲染框架内）。&lt;/p&gt;
&lt;p&gt;关键问题在于：小程序不是虚拟 DOM 模型，而是逻辑层与视图层分离，通过 JSON 数据桥接，因此架构必须围绕数据驱动。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二dsl-设计"&gt;二、DSL 设计&lt;/h2&gt;
&lt;p&gt;DSL 通常采用 JSON Schema 形式，核心包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;组件类型&lt;/li&gt;
&lt;li&gt;属性 props&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;低代码的关键在于“协议稳定性”，一旦 DSL 设计混乱，后续扩展成本会极高。因此会设计：&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;hr&gt;
&lt;h2 id="三运行时引擎"&gt;三、运行时引擎&lt;/h2&gt;
&lt;p&gt;运行时是核心。&lt;/p&gt;</description></item></channel></rss>