【2023】面试-前端整理适合(初, 中级)

517 阅读17分钟

【HTML5+CSS3】基础相关

又到了开年找金主的时候了
个人整理了些八股文面试简述,希望能帮上各位,(内容如有错误,请提出,后续纠正)

1.DOCtype有什么作用?
告诉浏览器使用那个版本的html规范来渲染文档

2.html5为什么只需要<DOCtype html>?
因为html不基于标准通用标记语言,不需要对文档类型定义进行引用,但是需要DOCtype来规范浏览器行为

3.简述html语义化的理解?

  • 页面呈现清晰的结构 -有利于SEO和搜索引擎获取
  • 方便其他设备解析和团队开发维护,语义化可读性

4.title与H1的区别?b与strong的区别?i与em的区别?

  • title属性没有明确意义只是标题,h1表示层次明确标题,对页面信息抓取很大影响-
  • strong表明重点内容语义加粗加强,b是无意义视觉加粗
  • em表明重点内容语义倾斜加强,i是无意义视觉倾斜

5.html xml xheml的区别?

  • html 超文本标记语言 审核语法不严格
  • xml 可扩展的标记语言。用于储存数据和结构
  • xhtml 可扩展的超文本标记语言,基于xml 作用与html相似,语法审核严格

6.src 与 href 的区别?

  • src用于替换当前元素,指向外部资源的位置,指向的内容将会嵌入文档中当前的标签的位置
  • href用于文档和引用资源之间确立联系,指向网络资源的位置,建立和当前元素之间的链接

7.渐进增强和优雅降级之间的含义?区别?
渐进增强:针对低版本的浏览器进行页面重构,保证基本功能正常使用,再针对高级浏览器进行效果,交互方面改进和追加功能
优雅降级:先构造完整的功能,在针对低版本的浏览器进行兼容
区别:优雅降级是从复杂的现状开始,并减少用户的体验功能,渐进增强是从基础上不断升级提升用户体验感

8.行内元素有哪些?块级元素有哪些?空元素有哪些?

  • 行内:a span img input select
  • 块级:div ul li ol dt dd h1-6 p
  • 空元素:br hr link meta

9.BFC理解?怎么触发?解决了什么?
BFC(Block Formatting Context):一个块级上下文,生成一个独立空间,空间之间不会相互影响,有属于自己渲染规则
触发:【float:left right】【display:flex inline-flex grid inline-grid inline-block】【position:absolute fiexd】【overflow:属性不为visible】
解决:防止margin重叠,清除浮动

10.清除浮动方法?
父级盒子设置:overflow:hidden
浮动元素后新增一个标签设置class为clear设置属性为both
添加伪类元素:

image.png

11.父随子动的解决方法?
设置padding增加内边框(需要根据增加的padding调整盒子px)
设置border增加边框(需要根据增加的padding调整盒子px)
overflow:hidden

12.盒子居中的方式?
1.先子绝父相
水平居中:left:50%;margin-left:负的自身宽度一半;
垂直居中:top:50%;margin-top:负的自身高度一半;
2.先子绝父相 margin:auto; left:0;right:0;  top:0;  bottom:0;
3.绝对定位 left和top:50% transform:translate(-50%,-50%)
4.怪异盒子居中:display:flex  jusiify-content:center  aligin-items:center

13.CSS元素那些可以继承?

  • 文本样式
  • 字体样式
  • 元素可见性
  • 表格布局属性
  • 列表布局属性

14.可以隐藏页面的元素?

  • display:none
  • visibillty:hidden
  • opacity
  • position:absolute
  • clip-path

15.如何简单实现0.5px边框?

image.png

16.如何判断一个元素是否在可视区域中?

  • offsetTop scrollTop
  • getBounding clientRent
  • intersection.onserver

17.文本溢出省略设置?

image.png

18.z-index是干什么用的?
z-inde 属性设置元素的堆叠顺序,且在绝对定位下才能生效
区别:0会创建一个新的堆叠上下文 1不会创建

19.给div盒子设置高100%不显示?
当你让一个元素的高度设置为百分比高度时,是相对于父元素的高度根据百分比来计算高度。 所以当父元素没有高度时,height:100%也就没有高度值,根据父级设置html,body高度。

20.简单说一下css样式的层叠性
1.样式表的来源:
用户代理样式表(浏览器默认)
用户样式表(某些浏览器允许作者自定义一些样式, 可忽略)
2.作者样式表
!important以及过渡和动画有一些样式来源
选择器优先级 :
行内样式
选择器优先级
3.源码顺序 (出现得越晚优先级越高)

【JS】相关

1.JS的数据类型有哪些?区别?
基本数据类型:string number boolean null undefined symbol bigint
引用数据类型:object  function array
存储区别:基本数据是存储在栈里面得,引用数据类型是存储在栈内存中的对象,在堆内存中储存的是栈内存对象的引用地址
值比较的区别:基本数据类型是值之间比较,引用数据类型是比较的引用地址
赋值的区别:基本数据类型的赋值是简单赋值,引用数据的赋值是对象的引用

2.创建实例对象的方式有几种?

  • new对象的方式创建对象
  • 通过class的反射机制创建对象
  • 利用序列化和反序列化创建对象
  • 通过克隆的方式创建对象

3.JS的继承方式有几种?

  • 原型链继承
  • 借用构造函数基继承
  • 组合式继承
  • ES6的class继承(不能变量提升,用extands关键词继承)

4.JS创建对象的几种方式*

  • 工厂模式
  • 构造函数模式
  • 原型模式
  • 组合构造函数和原型模式
  • 动态原型模式
  • 寄生构造函数模式

5.new创建一个对象,共经历几个阶段?

  • 创建一个空对象
  • 设置原型链
  • 让实例对象中的this指向对象,并执行函数体
  • 判断实例化对象的返回值类型

6.JS中this的指向?

  • this出现在全局函数中,指向windoW
  • this出现在严格模式中,永远不会指向window
  • 当函数为对象属性时,this指向对象
  • this出现在构造函数中,指向构造函数创建的对象
  • 当一个元素绑定事件处理函数时,this指向事件源
  • 在箭头函数中,没有this,this指向父级的this

7.箭头函数与普通函数的区别?

  • 箭头函数时匿名函数,不能作为构造函数,不能使用new
  • 箭头函数不绑定arguments
  • 箭头函数不绑定this 会捕获上级this,作为自己的值
  • 箭头函数通过call和apply方法调用一个函数时,只传入一个参数,对this没有影响
  • 箭头函数没有原型属性

8.JS中改变this的指向方法?
call(你要指向谁 参数1 参数2)第一参数不传或者null的时候this指向window
apply (你要指向谁,以数组的形式传参)第一个参数不传 或者传null的时候  this指向windowbind
bind (你要指向谁,参数1,参数...) 有返回值: 一个新的函数  这个函数就是改变this指向后的函数 新函数执行的时候  优先考虑bind方法传的参数

9.数组的用法

  • push 数组的末尾追加一个元素
  • pop 删除数组末尾的一个元素
  • Unshift 数组最前面添加一个元素
  • shift 删除最前面的一个元素
  • splice(开始索引位置,截取索引位置。替换新元素)截取数组中的内容
  • reverse 反转数组
  • concat 拼接数组
  • join 把数组每一项内容链接起来,变成一个字符串

10.ES5使用方法

  • use strtict 严格模式
  • indexOf(查找的值,开始的索引)找到数组中的某一项索引,没有则返回-1
  • forEach(function(itme,index,arr){})遍历数组,没有返回值
  • map 遍历数组 对数组每一项进行操作,返回一个新的数组,没有则返回undecfined
  • some 遍历数组 判断数组里面是否有该项,满足一项则返回true停止遍历,返回值true,不改变原数组
  • every 遍历数组 满足所有项返回true 任一项不满足返回false 停止遍历,不改变原数组
  • reduce(function(result,itme,index,arr){},0) 让数组的前后两项进行累计计算,返回其值,不改变原数组,返回最终计算值,

11字符串使用方法

  • charAt()找到字符串中指定索引位置的内容返回,没有则返回空字符串
  • charCodeAt()返回对应索引位置的unicode编码
  • IndexOf 按照字符找到对应的索引,从左往右
  • lastindexOf 在原始字符中,从右往左查找,没有则返回-1
  • substring(索引开始,到索引截取)截取字符串 包前不包后
  • Substr(索引开始,截取多少个)截取字符串
  • toLowerCase(字符串字母转小写)
  • toUpperCase(字符串字母转大写)
  • Split()将一个字符串切割成若干段,返回一个数组
  • slice()提取字符串的片段,并在新的字符串中返回被提取的部分,不包括结束位置
  • replace(被替换的值,替换的值)
  • trim()移除字符串首尾空白
  • concat(抗卡特)连接字符串,返回连接后的字符串

12.原型的5条规则?

  • 所有的引用类型都可以自定义添加属性
  • 所有的引用类型都有自己的隐式原型
  • 函数都有自己的显示原型
  • 所有的引用类型隐式原型都指向对应构造函数的显示原型
  • 使用引用类型的某个自定义属性时,如果没有这个属性,会去该引用类型的——proto—中去找

13深拷贝 浅拷贝 含义及如何实现?
浅拷贝:只拷贝地址,将数据中的所有数据引用下来,存放在一个地址,拷贝后的数据修改后,会影响到原数据中的对象数据
实现:object.assign 拓展运算符 slice concat
深拷贝:内容拷贝,将数据中的所有数据拷贝下来,拷贝后的数据修改后,不会影响到原数据
实现:json 递归 lodash

14.防抖和节流含义?
防抖:事件被调用后,再执行之前无论被调用多少次都会从头开始计时
节流:不管事件被调用多少次,总是按规定时间间隔执行

15.检测数据类型的方法?

  • typeof 检查基本数据类型
  • instanceof 检查对象
  • constructor 检查构造函数
  • object.getprototypeof 检查原型
  • object.prototype.tostring.call 检查任意类型

16.get和post的区别?
get是从服务器上获取数据,post是向服务器传送数据
get是明文传送追加url地址栏且不安全,post是密文传输
get传输数量有限,post则不受限制
get请求的参数是能是ASCLL码,中文需要UTF编码,post请求传参则不需要

17.var let const的区别?
let 和const没有变量提升,具有块级作用域
var具有变量提升,没有块级作用域
var let声明变量可以进行修改

18.ES6新增了那些语法?
箭头函数,解构赋值,自执行函数,拓展运算符,模板字符串
call apply bind let const promies async await (map set数据类型)

19.闭包怎么理解?
函数嵌套函数,里层函数可以返回外层函数的变量,外层函数通过一个变量去接收里层函数。
为什么要使用闭包:函数内部可以直接读取全局变量,函数外部自然无法读取函数内的局部变量,我们有时候需要得到函数内的局部变量。那就是在函数的内部,再定义一个函数。
闭包解决了什么问题:
不必为函数命名,避免污染全局变量。
提供对局部变量的间接访问,按需求进行共享和长期保存,维持变量,使其不被垃圾回收。
内部形成单独的块级作用域,通过闭包实现变量/方法的私有化。
闭包的缺点:
闭包使用不当可能造成内存泄露(是指你用不到的变量,依然占居着内存空间,不能被再次利用)。
怎么避免造成内存泄漏:删除意外的全局变量,被遗忘的计时器和回调函数,脱离DOM的引用。

20.如何中断forEach循环?
使用try-catch来终止循环抛出异常

21.cookie sessionstorage localstoage的区别?
cookie:生命周期为只在设置的cookie过期时间内,存放大小为4K左右,有个数限制,与服务器通信
sessionstorage:仅在当前会话下有效,关闭浏览器后被清除,大小一般为5M左右,仅在客户端保存,不参与和服务器通信
Localstoage:生命周期永久,大小一般为5M左右,仅在客户端保存,不参与服务器通信

【VUE】相关

1.VUE2和vue3的理解?
vue2的响应式是通过object.defineproperty对数据进行劫持和结合观察者模式,vue利用object.defineproperty创建一个observe来劫持监听所有属性,把这些属性全部转为gerter和serter, vue中每个组件实例都会对应一个watcher他会在组件渲染的过程中把使用过数据通过getter收集为依赖,之后依赖触发项的setter触发时,他通知watcher,他会关联组件重新渲染。
vue3则是通过proxy的代理替代object.defineproperty,直接监听对象和数组的变化,弥补了vue2中数组响应式的缺陷。

2.v-if和v-for的使用场景及优先级?
vue2中v-for优先级更高
vue3中v-if优先级更高
场景使用:不推荐在同一节点使用,避免不必要性能开销,如果使用可以通过嵌套template标签使用
v-for绑定KEY的作用:更好区分vue组件的唯一性,更高效更新虚拟DOM
v-for可以用index做KEY吗:在插入节点时候,容易导致真实节点的渲染问题,相同key值得虚拟DOM节点做对比,可能会复用真实节点,导致不能把虚拟节点渲染成真实节点

3.v-if和v-show的区别?
v-if:操作的是节点的在DOM树中的销毁与重建,v-if也是懒惰性的,再开始条件为false时什么都不做,直到条件为true才开始渲染条件块
v-show:操作的是css样式的display的样式显示和隐藏
使用场景:频繁切换下使用v-show,条件很少改变下使用v-if

4.常见的请求状态码?

  • 200:请求完成
  • 206:部分内容
  • 301:永久重定向
  • 302:临时重定向
  • 400:错误请求
  • 401:未经授权
  • 402:需求预留
  • 403:禁止访问
  • 404:请求错误
  • 500:服务器错误
  • 502:无效网关

5.watch和computed的区别?
watch:监听data数据变化 , computed:计算属性
watch:不支持缓存 , computed:支持缓存
watch:支持异步 , computed:不支持异步
watch:不会立即监听(调用immediate:true立即监听) , computed:立即监听
watch:不用调用 , computed:函数必须调用return
watch:一个数据影响多个数据 , computed:一个属性受多个属性影响

6.vue-router中hash和hisstory有什么区别?如何实现?
区别:在URL上,hash模式有带#号,history没有带#号
在刷新的时候,hash模式可以正常加载hash值对应页面,则history需要后台配置重定向,不然返回404页面
实现:hash模式在#号后的hash值变化,不会导致浏览器向服务端发送请求,不发送请求,就不会刷新页面,同时通过hashchange事件去监听hash的变化,根据hash的变化实现更新页面内容
history模式通过h5新增的api,pushstate和replacestate改变URL,但是不会发送请求,通过监听URL的变化实现更新页面内容

7.vue通信方式?
父子通信:在子组件内定义props的变量,接收父组件的数据,在父组件中引入子组件后注册使用,在父组件内创建一个标签以属性方式给proos变量传递数据
子传父通信:在父组件通过$on监听事件,事件处理函数的参数则为接受的数据,在子组件内通过$emit触发事件,第一个参数为要触发的事件,第二个参数为要传递的数据
跨组件通信:如在APP.vue文件中引入跨组件的组件,注册,在要传递数据的组件中引入事件总线EVentBus,并通过EVentBus.$emit(自定义事件名,传递的数据)将内容传到另一个组件中

8.vue中组件和插件的区别?
区别:注册方式,使用场景,编写的方式
组件:降低整个系统耦合度,调试方便,维护方便
插件:利用vue添加全局功能

9.vue-router的query传参和params传参的方式?
query传参时携带在URL的问号后面,(字符串和对象两种方式传参),在路由组件中通过$route.query获取
params传参是添加在URL路径里面的需要配合路由规则使用(字符串和对象两种方式传参),且在对象方式时只能配合name使用,不能配合path使用,在路由组件中通过#route.params获取

10.vue-router中router和route的区别?
router是路由实例对象,包含路由跳转方法
route是路由信息对象,包含和路由相关的信息(ath,params,hash,query,fullPath,matched,name)

11.vue要做权限管理怎么做?
前端权限控制可以分为四个方面: 接口权限
路由权限
菜单权限
按钮权限
接口权限:用户登录成功后获取token,前端保存token,通过axios请求拦截进行拦截,请求头中携带token
路由权限:初始化的时候挂载全部路由,并在路由上标记相应的路由权限信息,发送请求前效验
菜单权限:路由和菜单分离,前端配置路由信息,后端返回菜单,通过name字段,做唯一的性的效验,通过beforerouteenter做判断
按钮权限:通过v-if控制按钮是否显示和隐藏

12.首页登录路程及页面访问权限拦截简述?
登录路程:
1.登录页面填写登录表单后,点击登录按钮进行登录处理
2.登录处理时,调用状态管理库相关 API 实现发送异步登录请求并处理登录结果数据
3.如果登录成功,则将后端返回的 token 数据保存到 store 中,然后跳转到主页面
4.如果登录失败,则清除 store 中保存的 token 数据,提示错误信息

访问权限拦截:
1.访问每个页面前都应该进行拦截判断处理(vue 可以使用 vue-router 的导航守卫, react 通常在组件页面内部进行判断), 通常会先定义一个白名单数组保存无需登录即可访问的资源
2.从 store 中筛选登录的 token 状态数据,如果不存在 token,则说明用户未登录,如果存在则说明已登录。进行判断逻辑处理
3.没有 token,判断是否访问的是白名单页面,如果访问的是白名单页面,则放行,如果不是访问白名单页面,则跳转到登录页面
4.如果有 token,判断是否有用户基本信息及角色权限相关信息(这些信息通常也是会保存在 store 中)。 存在用户基本信息及角色权限信息,则说明用户的页面访问权限已处理过,无需重复处理,放行正常执行下一步
5.不存在用户基本信息和角色权限,则根据登录成功的用户 token 数据,查询用户信息(基本、角色权限)后保存到 store 中
6.有了用户角色权限信息后,要动态计算出登录用户可访问到的路由信息,也要将动态计算出的用户可访问路由保存到 store 中
7.在跳转到主页面后,可根据 store 中保存的用户可访问路由动态渲染出侧边导航菜单