2021年6月前端面试题目整理(个人面试遇到的问题)

2021年最新前端面试题目整理

最近面试的一些记录 题目和答案陆续整理中,没整理完的请见谅。
遇到过一些问题常规、结果乐观的面试,也有遇到全程自闭的。最终复盘,收集问题的时候,觉得很感激一针见血的面试官,虽然过程尴尬,但得到了鞭策和自己的知识盲区,这就是最大的收获。
本人2020年本科毕业,2020年6月至今(2021年6月)都在同一家公司工作,也就是工作经验一年,公司一家,公司前端框架是react+mobx+antd+typescript。

以下是整理出来的全部面试题目,后面有整理部分答案:
在这里插入图片描述

以下是整理的答案:(部分答案会引用网络上一些比较全面、清晰的答案,比我自己写的靠谱一些。如有不足欢迎指出✨🎈)

1. 你是怎样学习前端的
会根据学习路线去学习必要的技术,去看官方文档、网上视频教学,并结合实战项目去学习,也会结合红宝书之类的书籍去深入学习。

2. 盒子模型是什么
CSS的盒子模型是指,在网页中一个元素占有空间的大小由几个部分构成,包括元素本身的宽高content,内边距padding,边框border以及外边距margin。
在这里插入图片描述

目前盒模型分为两种:W3C标准盒模型 +IE盒模型

  • 第一种:W3C标准盒模型
    盒子实际内容(content)的width/height=我们设置的width/height;
    盒子总宽度/高度=width/height+padding+border+margin。
    在这里插入图片描述

  • 第二种:IE盒模型(怪异盒模型)
    我们设置的width=content宽度+内边距padding+边框border宽度(height同样)
    盒子总宽度/高度= width/height + margin = 内容区宽度/高度 + padding + border + margin
    在这里插入图片描述
    3. 点击按钮改变文本框的值,用框架和用原生JS分别应该怎样实现?
    这里主要考察对框架思想和原生的区别的理解

  • 使用框架:讲文本框的值绑定为一个变量,在点击按钮时去修改对应的变量,即可修改文本框的值

  • 使用原生js:通过id、类名等选择器都可以去找到该文本框的DOM元素,通过设置该元素的innerHTML属性或者innerText属性去设置文本框的值。

4. 有些模块可以兼容ES6 有些只能兼容ES5 这种情况怎么解决
type=‘module’,在script标签里面有type属性指定文件的类型 (type=‘text/script’),这个属性还有一个值:module和nomodule。

  • module:表示当浏览器支持ES6的时候执行的JavaScript代码

  • nomodule:表示当浏览器不支持ES6的时候执行的JavaScript代码。
    详细可参考: 这里 浏览器支持ES6的最优解决方案

    5. 把功能抽成公共组件的意义是什么

  • 降低各功能之间的耦合性,提高功能内部聚合性

  • 降低代码维护难度,在功能需要修改时只需要修改公共组件,而不需要处处排查,都修改一次。

  • 提升开发效率,一次编辑,多次使用。

  • 一个组件只专注做一件事,且把这件事做好。
    6. react的传值是怎么进行的

  • 父传子:利用props

//在父组件中:
<Son data={"some data"}/>
//在子组件中:
this.props.data //"some data"
  • 子传父:
    因为react有一个特点是单向数据流,数据只能从祖父组件传到父组件再传到子组件等,所以在子组件中不能直接修改父组件的数据,此时函数传参的方式去修改父组件的值。
    通过在父组件引入的子组件中传递一个函数并传参,子组件去触发这个函数更改参数完成数据更新
//在父组件中:
changeData=(newData)=>this.setState({data:newData})//父组件的修改数据的方法,新数据通过参数传进来
<Son changeData={(newData)=>this.changeData(newData)/>
//在子组件中:
this.props.changeData("the new data")
  • 兄弟组件之间传值:
    子组件传给父组件,由父组件再传给另外一个子组件
    7. 频繁点击按钮会造成异常,有什么解决方法(节流和防抖的原理)
  • 函数的节流:(时间没到,触发无效,时间继续计算)如果短时间内大量触发同一事件,那么在函数执行一次之后,该函数在指定的时间期限内不再反复触发,直至过了这段时间才重新生效。
  • 函数的防抖:(时间没到就被触发,重新计算时间)在规定的时间内只触发一次,如果多次触发,清除上次触发的事件,重新计算时间。
    详细可参考:这里

8.同一个程序要兼容不同尺寸的屏幕,比如包括移动端,应该怎么处理
借助于媒体查询:
在这里插入图片描述详细可参考:这里

9. 介绍一下mobx状态管理的原理,action是什么
Mobx/MobxReact 中有三个核心概念,observable、observer、action

  • observable: 通过 observable(state) 定义组件的状态,包装后的状态是一个可观察数据(Observable Data)。
  • observer: 通过 observer(ReactComponent) 定义组件。
  • action: 通过 action 来修改状态。
    详细可参考:这里

10. store里面存的数据变化了,组件是怎样知道他要去重新渲染数据的,他是怎么样通知到这个组件的

  • 当前组件的State中的属性改变时且当前组件的shouldcomponentupdate返回true,那么当前组件会rerender
  • 组件的props中的任一属性的值有变化(即使这个任一属性的值是对象,变化的仅仅是该对象中的某属性的值,此刻也算props发生了变化)且当前组件的shouldcomponentupdate return true时且当期组件所有父级以上组件的shouldcomponentupdate return true,当前组件才会re-render
  • 当前组件的shouldcomponentupdate即使返回false,当前组件里子组件若满足1中的条件,这个子组件依然会重新渲染
  1. 你一般怎么样去跟后台的接口交互?所以他这个就是你前端的module都是后台给你打提供的对吧
    这里我回答的是,后端会给restful接口,并注明参数以及参数的格式等,前端按需求传参和请求,拿到后端数据后去处理,然后渲染进页面,过程中如果有问题会再与后端沟通。但是感觉不是面试官想要的答案,可能我对问题的理解有误,所以面试官又问了 “所以他这个就是你前端的module都是后台给你打提供的对吧”。
  2. 怎么做异常处理
    回答的try catch等,面试官不是很满意。详细可参考: 这里
  3. ajax的拦截器你知道吗
    一般用于登录验证,当不在登录状态时,拦截用户对各个页面的访问,防止用户跳过登录页面访问其他页面。
var token = localStorage.getItem("token");
 
$.ajaxSetup({
    dataType: "json",
    cache: false,
    headers: {
        "token": token
    },
    xhrFields: {
        withCredentials: true
    },
    complete: function(xhr) {
        //token过期,则跳转到登录页面
        if(xhr.responseJSON.code == 401){
            parent.location.href = baseURL + 'login.html';
        }
    }
});
  1. Ajax axios同步还是异步
    关于ajax和axios:
    ajax:原生JS可以借助XMLHttpRequest对象封装异步请求,jquery已经帮我们做了封装,名字就叫ajax,所以平时说的ajax异步请求就指的是jquery的ajax。
    axios:axios也是对XMLHttpRequest的封装,axios是通过 promise 实现对 ajax 技术的一种封装,就像 ajax 是 通过 jQuery 来封装一样。但它更符合ES规范,推荐使用axios,因为它体积小,使用ajax必须引入整个jquery.js,而axios只需要引入axios.js。
    引自:这里
    同步还是异步?
    AJAX中根据async的值不同分为同步(async = false)和异步(async = true) 默认:true,异步
$.ajax({ 

        type: "post", 

       url: "path", 

       cache:false, 

       async:false, //默认true 异步

        dataType: ($.browser.msie) ? "text" : "xml", 

         success: function(xmlobj){ 

                      function1(){};

        } 

});

 function2(){};

axios同步异步区别在于是否使用了“async ” 及“await ”关键词:

//同步
async getfiles() {
   	var result={};
   	var param = new URLSearchParams()
       param.append('id', $("#type").val())
       var url = "/backstage/fileupload/getFileName.action";
   	await axios.post(url, param).then(function (res) {
           if (res.status == 200) {
           	result=res.data.data;
           } else {
               alert("获取失败!");
           }
       });
   	this.filenames=result
   }
//异步
getfiles() {
       	var result={};
       	var param = new URLSearchParams()
           param.append('id', $("#type").val())
           var url = "/backstage/fileupload/getFileName.action";
       		axios.post(url, param).then(function (res) {
               if (res.status == 200) {
               	result=res.data.data;
               } else {
                   alert("获取失败!");
               }
           });
       	this.filenames=result
       }

摘自: 这里
延伸:什么是同步,什么是异步?
同步请求即是当前发出请求后,浏览器什么都不能做,必须得等到请求完成返回数据之后,才会执行后续的代码。相当于排队。
异步请求就当发出请求的同时,浏览器可以继续做任何事,Ajax发送请求并不会影响页面的加载与用户的操作,相当于是在两条线上,各走各的,互不影响。
摘自:这里
15. setstate之后做了哪些处理
React在setState之后,会经对state进行diff,判断是否有改变,然后去diff dom决定是否要更新UI。在短时间内频繁setState。React会将state的改变压入栈中,在合适的时机,批量更新state和视图,达到提高性能的效果。
详细可参考:这里

  1. 连续将一个变量的值setState1 setState2 setState3的结果 ?如果在外面各自加一个settimeout的结果又是怎样的?
    连续两次setState会渲染1次,React 可以将多个setState() 调用合并成一个调用来提高性能。
    例子可参考:这里
    加setTimeout之后,因为setTimeout是同步的,带动state立即更新,可以执行多次。所以我们通常使用setTimeout来简单解决react中setState不及时生效的问题。
  2. Ts的泛型 大写的T是什么
    泛型,简单来说就是类型变量。在ts中存在类型,类型如number、string、boolean等,泛型就是使用一个类型变量来表示一种类型,类型值通常是在使用的时候才会设置。泛型的使用场景非常多,可以在函数、类甚至interface中使用。
    详细可参考:这里
  3. TS怎么继承 es6怎么继承 原生怎么继承 说一下原型链的继承
  • TS继承
    1:通过 extends 来继承父类
    2:调用父类使用super,子类继承父类的属性和方法,并且子类可以改写父类的属性和方法
class Person {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  run(): string {
    return `${this.name}在运动`
  }

}
//Me类来继承Person类
class Me extends Person {
  constructor(name: string) {
    super(name);//初始化父类的构造函数
  }
}
let m = new Me("doudouzi");
console.log(m.run());//doudouzi在运动
  • es6怎么继承

未完待续,下面的可以参考问题先自己寻找答案哦:

  1. Let const区别 和var的区别 一个class里面可不可以let两个同名变量
  2. 怎么理解闭包
  3. 数组对象有哪些原生的方法 map方法的作用
  4. 块级元素和内联元素 怎么给内联元素设置宽度
  5. flex这个属性怎么使盒子居中 flex:1和flex:2区别
  6. webpack这边保存 那边浏览器就可以更新是怎么做到的
  7. loader是什么作用 babel-loader作用
  8. 微信的网页版为什么能够及时的、实时地收到微信信息(而不用刷新页面)
  9. 浏览器的同源策略是什么 跨域的方案 介绍一下cors cors设置的是哪个属性 这个头是你请求发出去的,还是服务器设置的
  10. 浏览器自带的什么属性能检查前端的性能
  11. 画一个圆有几种方法 不用css怎么做
  12. Css3新特性有哪些 在项目中用到过哪些
  13. 原生的ajax怎么写
  14. 闭包是什么 有哪些使用场景 具体怎么写的叙述一下
  15. HTTP请求有哪几种方式 get post patch有啥区别(注意patch和post的区别)
  16. react的工作原理大概是什么 详细讲一下虚拟DOM

二 、围绕项目类:

  1. 从你的项目经验里面找一段比较好,参与度高的项目介绍一下
  2. 项目有哪些模块 你做过哪些模块,详细介绍一下项目中的XX功能
  3. 项目中遇到什么问题,是怎么解决的
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值