mm 2026笔试-前端开发

9 天前
3

mm 2026笔试-前端开发

CSS 相关

题目 1:容器宽度自适应与限制

题干: 设置一个容器,使其宽度占屏幕宽度的 80%,但最大宽度不超过 500px,以下哪个 CSS 写法是正确的?

选项:

  • A. width: 80%;
  • B. width: 80vw;
  • C. width: 80%; max-width: 500px;
  • D. width: calc(80% - 500px);

答案: C ✅

解析:

选项说明
A仅设置 80% 宽度,无最大宽度限制,不符合 "最大不超过 500px" 的要求
B80vw 是视口宽度的 80%,同样无最大宽度限制
Cwidth: 80% 控制基础宽度,max-width: 500px 限制最大宽度,完全符合需求
Dcalc(80% - 500px) 计算逻辑错误,无法实现目标效果

题目 2:CSS Grid 响应式列表布局

题干: 实现一个书籍列表布局,要求每行最多显示 4 本书,当屏幕宽度变窄时,列数自动减少为 2 本,以下哪个 CSS 写法最符合需求?

选项:

  • A. grid-template-columns: repeat(auto-fill, minmax(200px, 1fr))
  • B. grid-template-columns: repeat(4, 1fr)
  • C. grid-template-columns: repeat(auto-fit, minmax(200px, 1fr))
  • D. grid-template-columns: 1fr 1fr 1fr 1fr

答案: C ✅

解析:

选项说明
Aauto-fill 会创建尽可能多的列,但不会折叠空列,窄屏可能出现空白列
B/D固定 4 列,无法自适应调整列数
Cauto-fit 自动适配列数并折叠空列,minmax(200px, 1fr) 控制列宽范围(最小 200px,最大均分空间),符合响应式需求

题目 3:CSS 样式优先级

题干: 以下 HTML 元素最终显示的文字颜色是什么?

<div id="one" class="two" style="color:red">我是什么颜色</div>

选项:

  • A. yellow
  • B. green
  • C. pink
  • D. red

答案: 红色 ✅

解析: CSS 样式优先级从高到低:行内样式(style="")> ID 选择器(#one)> 类选择器(.two)> 标签选择器(div)。行内样式 color:red 优先级最高,因此文字为红色。


题目 4:大屏数据可视化布局重构

题干: 重构大屏数据可视化页面,要求左侧导航可折叠、右侧图表区域保持 16:9 宽高比、多端自适应(PC / 平板 / 大屏),且解决折叠时图表抖动、高分屏下元素溢出的问题,以下哪种方案最优?

选项:

  • A. 使用 Flexbox 嵌套布局,通过 calc() 动态计算尺寸,用 transition 实现折叠动画
  • B. 组合使用 Grid 布局定义宏观结构,Flexbox 处理局部对齐,通过 CSS 自定义属性维护比例系统,应用容器查询和视窗单位进行响应式适配
  • C. 采用 CSS Grid 定义布局模板,结合 aspect-ratio 属性控制图表区域,使用 CSS 容器查询处理多端适配
  • D. 使用 JavaScript 监听 resize 事件动态计算尺寸,通过 transform 缩放整个画布,利用 will-change 优化动画性能

答案: B ✅

解析:

选项说明
AFlexbox 适合一维布局,难以统一管理比例系统,无法解决复杂适配问题
BGrid 管宏观布局、Flexbox 管局部对齐、CSS 自定义属性统一比例、容器查询 / 视窗单位适配多端,是最优组合
C仅 Grid + aspect-ratio 缺乏局部对齐和比例统一管理
DJS 动态计算增加性能开销,transform 缩放易导致图表模糊

Vue 相关

题目 1:Vue watch 配置项

题干: 关于 Vue 中 watch 的 immediate 和 deep 属性,以下说法错误的是?

选项:

  • A. immediate 属性表示在 watch 首次绑定数据时,是否执行 handler 方法
  • B. immediate 值为 false 时,表示在 watch 声明时就立即执行 handler 方法
  • C. immediate 值为 true 时,表示在数据发生变化时才执行 handler 方法
  • D. deep 属性表示进行深度监听,目的是为了发现对象内部值的变化,复杂类型的数据时使用

答案: B、C ✅(错误选项)

解析:

选项说明
A正确,immediate: true 初始化时立即执行 handler
B错误,immediate: false 是默认值,仅数据变化时执行 handler
C错误,immediate: true 初始化时执行一次,数据变化时也执行
D正确,deep: true 用于监听对象 / 数组内部属性变化

题目 2:Vue 动态样式绑定(表单按钮)

题干: 表单验证场景中,当所有字段验证通过(formValid 为 true)时,提交按钮背景色为绿色,否则为灰色,以下哪个写法正确?

选项:

  • A. v-bind:style="{ backgroundColor: formValid ? 'green' : 'gray' }"
  • B. v-if="formValid" style="background-color: green"
  • C. v-model="formValid" style="background-color: green"
  • D. v-for="formValid" style="background-color: green"

答案: A ✅

解析:

选项说明
A动态绑定 style,通过三元表达式根据 formValid 切换背景色,符合需求
Bv-if 控制元素渲染,而非样式,formValid 为 false 时按钮会被移除
Cv-model 用于表单双向绑定,无法控制样式
Dv-for 用于循环渲染,与样式无关

题目 3:Vue 3 服务端渲染(SSR)性能优化

题干: 高流量促销活动场景下,Vue 3 SSR 页面出现服务器过载、首屏渲染延迟的问题,以下哪种优化策略最优?

选项:

  • A. 流式渲染(renderToStream)+ Transfer-Encoding: chunked
  • B. 异步组件加载 + 客户端 hydration 重试机制
  • C. renderToString + 服务器端内存缓存
  • D. 静态站点生成(SSG)+ 托管到 CDN

答案: C ✅

解析:

选项说明
A流式渲染优化传输过程,未解决服务器过载问题
B客户端优化,对服务器性能无帮助
C缓存完整 HTML 响应,避免重复渲染,大幅降低服务器 CPU / 内存消耗,适配高流量场景
DSSG 适合静态内容,促销页面多为动态数据(价格 / 库存),灵活性不足

题目 4:Vue 高频事件优化(mousemove)

题干: Vue 组件中绑定高频 mousemove 事件导致 UI 卡顿,以下哪种方案能最小化性能开销并保证状态同步?

选项:

  • A. 通过 provide/inject 定义事件总线,子组件触发自定义事件
  • B. 在组件模板中使用 @mousemove.passive 修饰符绑定处理函数,结合防抖逻辑
  • C. 为每个目标元素添加独立的 @mousemove 监听器,并在处理函数内调用 event.stopPropagation()
  • D. 在 setup() 中使用 window.addEventListener 绑定事件,在 onUnmounted 中移除监听器,并利用 requestAnimationFrame 节流

答案: D ✅

解析:

选项说明
A事件总线仅解决通信问题,无性能优化作用
Bpassive 适配滚动事件,对 mousemove 无效,且未结合 requestAnimationFrame 优化渲染时机
C多监听器增加内存占用,stopPropagation 仅阻止冒泡,无性能优化作用
D卸载时移除监听器避免内存泄漏,requestAnimationFrame 节流控制触发频率,减少重绘开销

TypeScript 相关

题目 1:TypeScript 类型推断规则

题干: 以下哪个不是 TypeScript 的类型推断规则?

选项:

  • A. 如果初始化时没有类型和赋值,推断为 any 类型
  • B. 如果初始化时有赋值但没有类型,推断为该值的类型
  • C. 如果是在大多数分支中推断出的类型,就使用那个类型
  • D. 如果初始化时有类型但没有赋值,推断为 unknown 类型

答案: C ✅(错误选项)

解析:

  • A/B/D:均为 TypeScript 核心类型推断规则
  • C:TypeScript 会根据所有分支计算联合类型,而非 "大多数分支" 的类型,因此该说法错误

JavaScript 基础与 DOM 操作

题目 1:fetch API 获取 JSON 数据

题干: 使用 fetch API 从 https://api.example.com/users 获取用户数据,并打印 JSON 格式的结果到控制台,以下哪个写法正确?

选项:

  • A. fetch('https://api.example.com/users').then(data => console.log(data))
  • B. fetch('https://api.example.com/users').then(response => response.json()).then(data => console.log(data))
  • C. fetch('https://api.example.com/users').then(response => console.log(response))
  • D. console.log(fetch('https://api.example.com/users'))

答案: B ✅

解析:

选项说明
Afetch 返回 Response 对象,未解析为 JSON,打印的是响应对象而非数据
Bresponse.json() 将响应体解析为 JSON,第二个 then 接收并打印数据,符合需求
C打印 Response 对象,非 JSON 数据
D打印 Promise 对象,无法获取实际数据

题目 2:为对象添加独立方法(音乐播放器)

题干: 音乐播放器项目中,每首歌曲对象共享原型方法 play,需为某一首歌曲单独添加 pause 方法(不影响其他歌曲),以下哪种方式正确?

选项:

  • A. 修改原型链中的原型对象
  • B. 直接为该歌曲对象添加 pause 方法
  • C. 使用 Object.setPrototypeOf() 方法
  • D. 使用 class 关键字并继承歌曲类

答案: B ✅

解析:

选项说明
A修改原型会让所有歌曲对象继承 pause 方法,不符合 "仅某一首" 的需求
B直接给单个对象添加方法,仅作用于该对象,无副作用
CsetPrototypeOf 修改原型,影响其他对象
D继承类需实例化新对象,无法给已有对象添加方法

题目 3:高频 DOM 更新性能优化

题干: 实时监控系统中,每秒需更新 5000+ DOM 元素,导致频繁样式计算和布局抖动,以下哪种方案最优?

选项:

  • A. 使用 document.createElement 逐个创建元素后直接追加到容器,通过 will-change: transform 强制提升图层
  • B. 将容器设为 display: none 后通过 innerHTML 全量替换,操作完成再恢复显示
  • C. 创建离屏 Canvas 进行数据绘制,通过位图快照替换 DOM 内容,同时维护隐藏的 DOM 副本
  • D. 采用文档碎片(document.createDocumentFragment)批量构建节点,使用 requestPostAnimationFrame 控制插入时机

答案: D ✅

解析:

选项说明
A逐个追加触发多次重排,性能差
Bdisplay: none 恢复时一次性大规模重排,仍会卡顿,且丢失元素状态
CCanvas 不适合交互场景,隐藏 DOM 副本增加内存占用
D文档碎片批量构建节点(一次重排),requestPostAnimationFrame 控制渲染时机,避免布局抖动

题目 4:新闻网站异步加载更多

题干: 开发新闻网站时,需实现 "点击加载更多" 功能,要求不刷新页面加载新内容,以下哪种方案最合适?

选项:

  • A. 预加载所有新闻并设置为 display: none,点击按钮切换为 display: block
  • B. 使用分页技术和静态页面,点击按钮导航到新页面
  • C. 使用 JavaScript 和 Fetch API 监听按钮点击,异步请求下一批新闻并添加到当前列表
  • D. 使用 <iframe> 加载新的新闻页面

答案: C ✅

解析:

选项说明
A预加载所有新闻导致初始加载慢,浪费带宽
B导航到新页面触发全页刷新,不符合需求
CAJAX 异步请求 + 追加内容,实现无刷新加载,是标准方案
D<iframe> 体验差,不利于 SEO 和性能优化

性能优化相关

题目 1:高并发实时金融数据处理

题干: 金融监控系统需处理高并发实时数据流,保证数据实时性、渲染性能和代码可维护性,以下哪些方案正确?

选项:

  • A. 使用 WebSocket 进行数据推送,结合 Redux 实现状态管理,并使用 memoization 技术优化渲染性能
  • B. 使用 AJAX 定时轮询数据,结合 Vue 的响应式机制,确保每次数据更新都直接触发 UI 更新
  • C. 使用 Service Worker 进行数据缓存,结合自定义事件进行数据更新,并在每次更新时重绘整个 UI
  • D. 使用 GraphQL 订阅进行数据推送,结合高阶函数封装数据处理逻辑,同时利用虚拟 DOM 减少重绘次数

答案: A、D ✅

解析:

选项说明
AWebSocket 实时推送 + Redux 状态管理 + 记忆化优化渲染,符合需求
BAJAX 轮询延迟高、服务器压力大,每次更新触发 UI 导致频繁重绘
CService Worker 适合离线缓存,全量重绘性能差
DGraphQL 订阅按需推送 + 高阶函数封装逻辑 + 虚拟 DOM 减少重绘,符合需求

数据处理相关

题目 1:学生成绩统计

题干: 给定学生成绩数组,计算 classOne 为 true 的学生的语文 + 数学总分。

输入:

const studentList = [
  { id: 5, name: "Alex", chineseScore: 98, mathScore: 56, classOne: true },
  { id: 82, name: "Bob", chineseScore: 73, mathScore: 99, classOne: true },
  { id: 22, name: "Cindy", chineseScore: 20, mathScore: 59, classOne: false }
];

要求: 使用 JavaScript 内置方法实现。

答案:

// 筛选 + 累加
const totalScore = studentList
  .filter(student => student.classOne) // 筛选一班学生
  .reduce((sum, student) => sum + student.chineseScore + student.mathScore, 0); // 累加总分

console.log(totalScore); // 输出:326

解析:

  • filter:过滤出 classOne: true 的学生
  • reduce:遍历筛选结果,累加语文和数学成绩,初始值为 0

题目 2:购物车商品归类

题干: 给定购物车数组,将同名商品归类到同一数组中(以商品名称为键)。

输入:

const shoppingCart = [
  {name: 'Apple', price: 1.99, quantity: 3},
  {name: 'Apple', price: 1.99, quantity: 3},
  {name: 'Xiomi', price: 2.99, quantity: 2},
  {name: 'Samsung', price: 3.99, quantity: 1},
  {name: 'Tesla', price: 3.99, quantity: 1},
  {name: 'Tesla', price: 4.99, quantity: 4},
  {name: 'Nokia', price: 4.99, quantity: 4}
];

要求: 使用 reduce 实现归类。

答案:

const groupedCart = shoppingCart.reduce((result, item) => {
  // 若当前商品名称未在结果中,初始化空数组
  if (!result[item.name]) {
    result[item.name] = [];
  }
  // 将当前商品添加到对应数组
  result[item.name].push(item);
  return result;
}, {}); // 初始值为空对象

console.log(groupedCart);

输出:

{
  Apple: [ {name: 'Apple', price: 1.99, quantity: 3}, {name: 'Apple', price: 1.99, quantity: 3} ],
  Xiomi: [ {name: 'Xiomi', price: 2.99, quantity: 2} ],
  Samsung: [ {name: 'Samsung', price: 3.99, quantity: 1} ],
  Tesla: [ {name: 'Tesla', price: 3.99, quantity: 1}, {name: 'Tesla', price: 4.99, quantity: 4} ],
  Nokia: [ {name: 'Nokia', price: 4.99, quantity: 4} ]
}

解析: reduce 遍历数组,以商品名称为键构建对象,将同名商品收集到对应数组中,实现归类。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...