三年前端面经 | “金三银四”面试问题分享

1,316 阅读4分钟

个人情况

三年 web 前端工作经验,坐标深圳。主要技术栈是 VUE + 微信小程序原生开发,工作做的大多是中后台管理系统以及配套的微信小程序。

在三四五月的时候陆续面了几家公司,对面试过程中遇到的基础问题和项目问题进行中总结。各个面试官风格不一,有的很基础有的深入,这里只进行分类总结:

HTML

  • 对 HTML 语义化的理解以及语义化的好处
  • HTML5 新增的标签

CSS

  • flex 布局和 grid 布局的区别及使用场景
  • css 选择器有哪些;说一下选择器的优先级

JS

  • JS 的基本类型有哪些

  • 深拷贝和浅拷贝的区别

    • 手写一个简单的深拷贝
  • JS 有哪些作用域

  • 为什么会产生内存泄漏的问题

  • 对闭包的理解

    • 使用闭包需要注意什么
  • 有什么方法可以改变 this 的指向

    • bind 和 call 方法的区别
  • new 主要做了哪些事

  • 说一下对 Promise 的理解

    • Promise 有哪几种状态;状态是否是可逆的;
    • Promise 有哪些常用的方法;与 Promise.all 对应的方法是什么;
    • 手写一个简单的 Promise
  • 怎么实现限制同时只能发送3个请求;

  • 说一些你常用 ES6 的新特性

    • for...in、for...of 、forEach 的区别以及使用场景
    • for...of 的实现原理
    • let、const、var 的区别;let 和 const 的作用
    • 在 es6 之前怎么实现 const
    • 箭头函数和普通函数的区别
  • 简单说下事件循环

  • 什么是微任务和宏任务

  • 同源指的是什么

  • 怎么解决跨域

  • iframe 使用有什么问题

  • 说说 JS 有哪些设计模式;可以结合 Vue 的底层实现

Vue

  • vue 的优缺点;可以结合你使用过程遇到的问题

  • 怎么理解 MVVM

  • 简单说下双向绑定的原理

    • 如果不想对某个数据进行双向绑定怎么操作
  • 生命周期及钩子函数

  • 组件 name 的作用

  • data 为什么返回一个函数

  • 组件的主动销毁的方式

  • $nextTick 是什么以及使用场景;

    • $nextTick 的实现原理
  • 常用的指令

  • 自定义指令的用法(自定义指令的原理;在项目中使用过的自定义指令及实现)

  • 过滤器的用法(全局过滤器和组件内过滤器的用途;在项目中使用场景)

  • v-for 和 v-if 的优先级以及原因

  • v-for 中 key 的作用

  • 说下组件通信的方式

    • eventBus 和 vuex 的区别
  • computed 是怎么实现监听数据变化的

  • computed 和 watch 的区别

    • computed 是怎么实现缓存的
  • 在 mounted 里面直接定义的数据时挂载在 vue 的哪里

  • 虚拟 DOM 是什么;为什么需要虚拟 DOM;

    • 说一下 Vue 的 diff 策略

Vue-Router

  • 路由的钩子函数以及使用场景

  • hash 和 history 的区别

    • hash 和 history 分别是基于什么实现的

Vuex

  • mutation 和 action 的区别

    • mutation 为什么只能写同步函数

Webpack

  • 构建工具具体做了什么

  • webpack 的生命周期

  • webpack 的构建过程

  • 有没有使用过什么 plugin

  • 做过哪些化方案

    • 有没有做过预编译;预编译的方案;

浏览器和网络

  • 浏览器输入 url 到页面展现的过程(必问)

  • 重绘和重排是什么;怎么优化

  • 说下什么是强缓存和弱缓存

    • E-tag 是怎么生成的
    • HTTP1 到 HTTP1.1 增加了哪些关于缓存的请求头字段
  • 说一下 websocket 协议

  • TCP 和 UDP 的区别

  • 说下 TCP 的三次握手和四次挥手

  • HTTP 和 HTTPS 的区别

性能和优化

  • 你做过哪些前端性能优化

  • 如何做前端项目的性能分析;具体指标

    • 怎么检测前端项目运行时的性能
  • 有没有遇到浏览器的兼容性问题;

  • 服务端渲染是什么;有什么好处;

    • 服务端渲染为什么会加快首屏渲染速度

编程

  • 字符串轮转

给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。

  • 模板字符串
let templateStr = 'i am { name },age { age },job { job } ';
let data = {
    name:'xbd',
    age:18,
    job:'CTO'
}
console.log(templateFunc(str,data));
//i am xbd,age 18,job CTO templateFunc(str, obj) {
    // TODO
}

微信小程序

  • 怎么缩小主包的体积;

项目方面

  • 介绍一个项目
  • 项目中遇到的问题/困难(必问)
  • 平时的学习方式;最近学到的东西
  • 项目重构过程新老版本怎么交替
  • 对于前端工程化的理解
  • 前端项目选型的考量和过程
  • 你的职业规划是什么