前端面试问题汇总

145 阅读6分钟

本篇文章将分类汇总2020年前端岗校园秋招的面试问题,及时查漏补缺,每次面试完都会实时更新。

一、HTML & CSS

  1. CSS实现:4个div,一个在上,三个并列在下
  2. 块级和行级有哪些标签
  3. overflow属性值有哪些
  4. CSS样式?内嵌样式等导入方法?import和link的区别
  5. 手写实现两栏布局,一栏固定宽度200px,右边把剩下的铺满,左右两列等高,即左边一列增高右边一列也会跟着增高,至少三种方法
  6. 简单介绍一下盒子模型
  7. display有哪些属性,block、inline和inline-block的区别,可以修改margin吗
  8. CSS优先级
  9. 块元素、行内元素有哪些
  10. 盒子模型
  11. px、em、rem
  12. CSS优先级
  13. 水平垂直居中
  14. 元素隐藏方式
  15. h5标签语义化有什么好处
  16. 水平垂直居中
  17. 用css选择器获取class为level-2 的第一个元素和最后一个元素。
  18. Chrome的最小字体限制是12px,如果想要字体比12px更小,怎么做

二、JavaScript & ES6

  1. call和apply区别
  2. 作用域是什么意思,变量提升什么意思?没有定义直接使用是全局还是局部
  3. js数组方法
  4. js的继承方法
  5. 手写借用构造函数方法的代码
  6. JS原生DOM操作,说出具体API
  7. 原生JS创建一个列表,<ul>标签下有十个<li>,点击每个li能打印出它的索引。具体描述代码实现。
  8. 具体说下继承机制及原型和原型链
  9. 介绍事件循环机制
  10. 什么是同步事件和异步事件,JS中哪些是同步任务,哪些是异步任务
  11. JS是多线程的吗,同步任务是在哪个线程完成的,异步任务是在哪个线程完成的
  12. ES6最常用的是什么
  13. 简单介绍一下var、const和let的区别
  14. 闭包是什么,有何用处及弊端?多大会形成垃圾?
  15. 改变this指针指向的方案有哪些,及其之间的差异?
  16. 声明变量,过程,函数声明和函数表达式
  17. <script>标签放在head和body有什么不同?怎么能不先加载(async和defer)
  18. 事件捕获、事件冒泡
  19. 实现function counter(){},全局下每次调用返回值+1
  20. 跨标签页通讯:localstorage
  21. 跨浏览器的数据是如何保持一致的?
  22. Generator和async/await的区别
  23. 原生js实现拖拽(onmousestart等事件、H5的drag和drop),拖拽实现过程
  24. 通过类名获取元素节点的DOM操作
  25. 闭包的理解
  26. 用setTimeout实现每秒输出1,2,3,,...,10
  27. DOMContentLoaded和load的区别

三、计算机网络

  1. get和post区别
  2. http头域有哪些
  3. 什么是cookie和session?区别是什么?
  4. sessionStorage、localStorage的区别
  5. http协议,什么是http协议,http请求分哪几部分
  6. TCP四次挥手为什么要有TIME_WAIT状态?
  7. HTTP中Connection:keep-alive实现的什么
  8. get和post区别,get对携带的参数的限制有什么

四、React相关

  1. react生命周期
  2. 路由react-router是异步加载吗?怎么做的
  3. React生命周期,从两个点说,一是初始化加载渲染时生命周期的流程,二是更新时生命周期的流程
  4. API请求放在哪个生命周期里,为什么
  5. React中状态state更新机制
  6. react生命周期,在哪个生命周期中发起异步请求,应该是componentDidMount,为什么不能放在compontWillMount?

五、前端工程化

5.1 浏览器

(包括同源、跨域、渲染过程和其他)

  1. 同源策略了解吗 +1+1

  2. 什么是跨域?如何解决跨域问题 +1+1

  3. jsonp的原理,实现流程

  4. 浏览器解析URL

  5. 跨域是在浏览器还是服务器设置的

  6. 同源策略什么行为受到限制

  7. 预检请求,请求方法options

  8. 跨域方法

  9. 浏览器解析URL过程

  10. 浏览器缓存,浏览器端让缓存失效的方法,如何让前端浏览器不进行缓存

5.2 前端安全

  1. 了解web安全方面吗
  2. CSRF,如何防止 CSRF 攻击。
  3. csrf攻击流程,浏览器怎么带着你的cookie

5.3 性能优化

  1. CSS优化方案
  2. 性能优化方法,其中js打包合并文件都放在一个文件里吗?关于首屏加载优化有了解吗?

5.4 其他

  1. 服务器端渲染、客户端渲染
  2. 前后端分离的优点
  3. webpack打包了解吗(2次)

六、计算机基础知识

(数据结构、操作系统等)

  1. 面向对象的语言有哪些,特点。解释多态。
  2. 两个链表交叉怎么找交叉点
  3. 内存缓冲区和虚拟内存区别
  4. 进程和线程区别
  5. 大根堆和小根堆,堆排序,时间复杂度
  6. DFS和BFS

七、输出题

  1. 考察变量作用域
for (let i = 0; i < 10; i++) {
  // ...
}
console.log(i);   //i is not defined  与undefined不同  ES6书上原题

let name = 'aaa'; 
const getName = (name) => {
   let name = 'bbb'    //会报错,name已经存在 ,因为参数name已经被定义,let不能重新声明,var可以
   console.log(name)   
}
getName('ccc');
  1. 同上
function testOrder(arg) {
    console.log(arg); 
    console.log(a);
    var arg = 'hello';
    var a = 10; 
    function a() {
        console.log('fun');
    }
    console.log(a); 
    console.log(arg);
}; 
testOrder('hi');
  1. 闭包
var data = [];  
for (var i = 0; i < 3; i++) {  
    data[i] = function () {   
         console.log(i);  
    }; 
}  
data[0]();  // 3
data[1]();  // 3
data[2]();  // 3
  1. this指向
window.name = 'Outer';
function A () {
   this.name = 123;
}
A.prototype.getA = function(){
    console.log(this);
    return this.name + 1;
}
let a = new A();
let funcA = a.getA;

funcA();  
  1. class
class Student{
    constructor(name) {
        this.name = 'B'
    }
    getInfo() {
        return {
            name: 't',
            getName: () => {
                console.log(this)  
                return this.name
            }
        }
    }
}
var st = new Student()
var obj = st.getInfo()
console.log(obj.getName())
  1. Promise
console.log('script start');

Promise.resolve()
  .then(function (res) {           // 微任务队列
    console.log(res, 'promise1');
    return 1
  })
  .then(function (res) {
    console.log(res, 'promise2');
  });

Promise.resolve()
  .then(function () {
    console.log('promise3');
  })
  .then(function () {
    console.log('promise4');
  });

console.log('script end');
  1. 下面代码能执行吗
function * fn1() {
    yeild 123;
}
function * fn2() {
    yeild 123;
}
co(function *() {
    yeild fn1()
    yeild fn2()
})()
  1. 下面代码输出什么
var name = "outer";
function Main(){
    var name = 'main';
    var innerObj = {};
    innerObj.info = function(){
        console.log(this.name);
        console.log(name);
    };
    return innerObj;
}
var obj = Main();
obj.info();  // undefine  main
  1. this指向
let ele = document.querySelector('.box')
ele.onclick = function(){
	console.log(this)
}
ele.onclick = ()=>{
	console.log(this)
}
  1. promise输出
setTimeout(_ => console.log(4))
new Promise(resolve => {
  resolve()
  console.log(1)
}).then(_ => {
  console.log(3)
})
console.log(2)

八、算法题

  1. 程序判断非空字符串是否是由所含的一个子串重复多次组成,返回true/false?
  2. 设计一个flat函数将如下数组arr=[1,2,['3',4,'5',[6,[7,8],9]]]输出为[1,2,'3',4,'5',6,7,8,9]。至少写出两种方法,要求不能改变数组中的原始数据类型。
  3. 一个数组怎么找出最大值
  4. 算法:数组合并
  5. leetcode7:整数反转(123->321,450->54,-78->-87)
  6. leetcode64:最小路径和
  7. 后面第一个大于自己的元素:给定一个数字数组,找到数组每个值后面第一个大于它自身的元素,如果没找到,设为-1。最后返回一个包含所有找到的值的新数组。
  8. leetcode5:最长回文字符串
  9. 算法:数组反转,要求在原数组上操作
  10. F0=F1=F2=1,F(n)=F(n-2)+F(n-3)(n>=3).分别采用递归和非递归的方法实现。
  11. 实现队列
function Queue(){}
Queue.prototype={
    putInQueue:function(item){}
  	getFromQueue:function(){}
    length:function(){}
    clearQueue:function(){}
};
var q = new Queue();
q.putInQueue("A");
console.log(q.length());

九、智力题

  1. 数学题,20块钱20个瓶,2个空瓶换1瓶,一共能喝多少瓶。39