2021 夏末初秋 前端面试题

一个前端小白在夏末初秋时节进行人生第一波面试的旅程......

一只lucky cat吃饱饱后的碎碎念......

以下是面试过程中面的问题,经典又大众,希望可以给大家提供一点复习的方向,金三银四,现在开始准备刚刚好。

CSS 篇

css里面flex是必要问的,包括flex的原理,水平垂直居中也比较高频,如果其岗位需要做很漂亮且兼容性高的页面,css这块应该就不止这点内容了。

使用flex的场景

flex: 1 表示什么,flex是如何计算的

flex的order属性

用sass如何处理1像素

子盒子在父盒子水平垂直居中

实现三列布局

css盒模型,css如何设置盒子

margin的折叠如何解决

如何形成BFC,BFC使用场景

CSS模块化怎么做的

css3动画的参数

移动端兼容性怎么做

单行文本省略和多行文本省略

ios上滑动屏幕一gen一gen的卡顿,如何处理

JS 篇

es6相关的是必须必须会问的,尤其是promise,跨域、闭包这些都比较高频。

数组方法reduce第二个参数

普通函数和箭头函数的区别,箭头函数可以new吗,箭头函数能使用argument获取参数吗

如何数组去重

es6常用吗,常用哪些

新增的数组方法

forEach和Map的区别

promise了解多少

数值类型和引用的区别

var,let,const的区别

es6的set和map

map的key跟普通的key有什么区别

promise回调相关和setTimeout的执行顺序相关

set和weakSet的区别

symbol用过吗

扩展运算符的使用场景

typeof [] 返回什么,,typeof NaN 返回什么

如何判断一个变量是不是数组

'1' instanceof String 返回什么

什么场景下用闭包,闭包的概念

浏览器底层是怎么实现闭包的

get和post的区别

实现跨域的方式

cors如何设置跨域

cors原理,cors中请求都是发送一次吗

jsonp原理

类的实例化过程,new操作符的过程

如何实现一个类和继承

jquery的$是什么

DOM事件的事件流

addEventLisner第三个参数

框架篇

框架这块原理必须要深入学习下,可以没有看过源码,原理必须知道。我面的react,所以问的都是react相关的。

常用的hooks

useEffect干什么用

useState某种操作总是获取上一次值,如何处理

useReducer怎么用,它是干嘛的,与redux的区别

setState同步?异步?,setState异步做了什么

为啥要用hooks,React hooks的作用

hooks的使用需要注意什么

hooks可以用在判断条件里面吗,为什么

hooks可以用在哪里,可以用在HOC里面吗

一个组件很深,数据传递的方法

组件通信方式

redux的数据流,原理

redux的如何引起组件更新

class组件的state数据是如何绑定的,内部原理的实现

class组件和函数组件,函数组件和class组件相比的优点

class组件性能优化,函数组件的性能优化

函数组件和class组件生命周期有啥区别

batchUpdate机制

react fiber了解多少

JSX怎么变成React.createElement的
ErrorBoundry能监控到所有组件的error吗

suspense原理

react18新特性

react的生命周期

使用react注意什么

vue中组件通信

v-modal语法糖

$on $emit原理

vue的生命周期

vue和react的区别

单页面应用的SEO如何做,如何进行SEO搜索引擎优化

性能优化 篇

前端性能优化一般包括代码层面、webpack层面、http层面、加载、封包等方面,浏览器缓存和http缓存几乎必问。

前端性能优化

html、js、css、图片,不同的缓存策略

强缓存如何设置

浏览器如何实现缓存的

垃圾回收机制

http强制缓存和协商缓存

强制缓存返回的状态码,强制缓存cache-control的属性值

协商缓存怎么知道缓存过期了

Etag是如何生成的

防抖和节流的概念,使用场景

React性能优化

浏览器缓存了解多少

有的文件不需要缓存,例如html,如何设置

项目中做的性能优化,webpack中如何优化

webpack 篇

webpack需要知道plugin和loader如何加载的内部如何实现的,自己实现过loader和plugin或者使用webpack解决过什么问题绝对是加分的。

loader和plugins的区别

常用的plugins/loader

webpack的plugin内部怎么执行的

webpack为啥存在,它的作用

自己实现过loader和plugin吗,内部是如何实现的

webpack4与webpack5

其他 篇

svg和canvas的区别

commonJS和import的区别

IE的盒模型跟标准的盒模型什么区别

模块化和组件化的区别

模块化的发展历史

js事件循环

除了contenthash还有什么hash模式

babel机制

CDN的流程

栈内存和堆内存

脚手架如何搭建

模块化了解多少,怎么应用

代码 篇

现在高级了,不需要在纸上手写代码了,一般都线上面试,可以在线敲代码,竟然还可以运行(捂脸哭)。

算法直接刷力扣,双指针挺牛,有朋友凭双指针“打遍天下”。

其他手写代码题一般是某些方法的实现或者promise相关。

也有给一段代码问打印顺序或者打印出什么,this指向、promise与setTimeout、闭包绝对高频。

斐波那契数列 递归实现

()[] {}/(({[]}))/({]) 如何判断是否都是配对出现的

手写promise.all,实现后再把promise.all由并行变成串行

原型链相关

function fun() {};
var f = new fun();

f.__proto__ // === ? 1 fun.prototype
f.__proto__.__proto__ // === ? 2 Obejct.prototype 
f.__proto__.__proto__.__proto__ // === ? 3 null
f.__proto__.__proto__.__proto__.__proto__ // === ? 4 会报错,因为上一个已经是null了
fun.__proto__ // === ? 5 Funtion.prototype
fun.__proto__.__proto__ // === ? 6 Obejct.prototype 
f.prototype // ? 7 undefined 实例没有prototype
fun.prototype // ? 8  { constructor: f }

useEffect

const [n, setN] = useState(1)

useEffect(() => {
  console.log('a', n)
  return () => {
    console.log('b', n)
  }
}, [n]);

结果:初始化后 打印 'a',1再次setN(2)后 先打印 'b', 1 再打印 'a',2

变量提升

var a = 123;
function aa() {
	console.log(a);
  if (false) {
  	var a = 'hello word';
  }
}
aa();

结果:打印出来的是undefined,因为虽然if false里面不执行,但是js预解析的时候已经把a变量提升了

this指向

var a =  1;

function Fn1() {
  var a = 2;
  alert(this.a + a);
}

function Fn2() {
  var a = 10;
  Fn1();
}

Fn2();

var Fn3 = function() {
  this.a = 3;
}

Fn3.prototype = {
  a: 4
}

var fn3 = new Fn3();
Fn1.call(fn3);

先alert出3,再alert出5
执行Fn2()时,this指向window,this.a是1
执行Fn1.call(fn3)时,this指向fn3,this.a是3,为啥不是4呢,因为先在实例中查找,找不到再去原型查找

闭包

function a() {
  let b = 5;

  return function() {
    console.log(b++)
  }
}

a()();
a()();
a()();

var c = a();
c()
c()
c()

结果 5 5 5 5 6 7
因为后者才形成闭包

promise

function aa() {
  return new Promise((resolve, reject) => {
    resolve(1);
    console.log(2);
    reject(3)
  })
}

aa().then(res => {
  console.log(res)
}).catch(err => {
  console.log(err)
}).then(res => {
  console.log('456')
})

结果:2 1 456  
因为promise状态一旦发生改变就不会再变,所以reject(3)不会执行
因为promise里面的代码是同步的,回调才是异步的
如果去除resolve(1)
则结果:2 3 456
因为不管是then还是catch只要里面没有new Error返回的都是resolved状态

数组拍平

// 使用reduce如何写

const arr = [1, 15, 'string', true, [3, 5, [17, 6, 88, [4, 28]]], {name: '小明是个捣蛋鬼'}]

function flat(arr) {
  if (!Array.isArray(arr)) return arr;

  return arr.reduce((result, item) => {
    return result.concat(Array.isArray(item) ? flat(item) : item);
  }, [])

}

flat(arr)

// 新的api如何拍平
// Array.flat()
// arr.flat(Infinity)

this相关

function A() {}
function B(a) { this.a = a }
function C(a) { if (a) { this.a = a }}

A.prototype.a = 1;
B.prototype.a = 1;
C.prototype.a = 1;

console.log(new A().a)
console.log(new B().a)
console.log(new C(2).a)

// 结果是 1 undefined 2

手写Object.assign

手写promise.all

手写防抖

dom事件

有三个div a -> b -> c,点击c,console如何打印

2021 夏末初秋 前端面试题

结果:捕获a 捕获b 冒泡c 捕获c 冒泡b 冒泡a

点击c,abc的事件同时触发,先进行捕获阶段再进行冒泡阶段,c是目标元素,打印的顺序是注册的顺序

项目 篇

项目这块一定要准备好,梳理项目难点、亮点,遇到的难题如何解决的,即考察了你的项目难度复杂度也考察了你的解决问题的能力。

面试官一般从这些问题引入然后再跟你具体细聊。

你在项目中哪些是你主动推进的,达到什么收益或者提升

说项目亮点/难点

你们系统如何实现的错误监控

封装过最复杂的组件

你们的脚手架都包含什么

如果某个模块下要修改antd里面的table样式,怎么做

你做的组件,具体怎么实现的

让你做一个监控平台,如何做

前后端请求如何做一个安全上的机制

使用过什么hook什么库吗

自己编写过hooks吗什么功能

你们的脚手架是怎么做的

webpack自己配置过吗

开放题 篇

你平常有哪些学习方式

你最近在学新的东西

平常学习的方式

平常遇到的问题会记录吗

未来规划

如何学习

对前端团队的要求

HR 篇

HR一般了解一下候选人的表达能力,是否真诚等等,当然最重要的是薪资了。

你做的什么项目,讲述一下

你的项目出现过什么线上bug

未来规划

你的优点/缺点

对公司或者前端团队有什么要求或者憧憬

 

上一篇:JS高级进阶总结day02---面向对象编程三大特征,原型链总结


下一篇:常见各种排序算法时空复杂度及稳定性比较