前端常见(Vue、React)面试及答案

560 阅读5分钟

个人记录,仅供参考,部分内容可能存在歧义或者错误见谅,部分图片来自互联网,如有侵犯抱歉

CSS

经典布局 左边固定右面自适应

浮动、定位、flex、表格布局、grid布局

CSS盒模型的认识

content+border+padding+margin构成,分为标准模型+IE模型,标准模型的宽高是指content的宽高,IE模型指content+padding+border之后的宽高,通过box-sizing:content-box,border-box设置

BFC

  • 概念:块级元素格式化上下文。
  • 原理:BFC是一个容器是容器内外的元素不会互相影响,使BFC内的浮动元素参与到容器的宽高计算,通常用来解决边距冲突重重叠,或者清楚浮动。
  • 创建BFC:设置float,绝对、固定定位,设置display:inline-block,overflow不为默认值

js

异步加载js

js生成script标签设置src;defer异步加载,并使脚本在文档解析完成后执行;async异步加载,加载完毕后执行

this是个啥

就是指调用函数时的context上下文

闭包是个啥

指在一个函数内部中生命变量,在让函数内声明的函数使用变量就形成一个闭包,通常会再把函数内生命的函数return除去供外部使用来操作变量,作用就是创建一个局部变量

DOM事件相关

  • 事件级别 DOM0,DOM2,DOM3;DOM0是通过el.onclick,DOM2是通过addEventListener,DOM3增加了更多事件比如鼠标键盘相关
  • 事件模型 捕获、冒泡,指事件由捕获到达目标元素再由冒泡发送到全局。window-document-html-body-XXX-目标元素
  • 自定义事件 new Event,dispatchEvent()

常见循环的方式有什么不同

普通for、while、for-in(索引数组 对象)、for-of(不能用于对象)、Object.keys、Object.getOwnProperty(返回对象的自有属性)、map、forEach(可以return)、reduce、every、some、fiter

异步相关

callback promise async

深拷贝浅拷贝

  • 浅拷贝指复制一个对象的地址,使用同一片内存,修改之后会互相影响;深拷贝指开辟一块新的内容复制一个属性相同的对象,互不影响;
  • 浅:Object.assign(),展开运算符,concat(),slice()
  • 深:JSON.parse(JSON.stringify())

原型

image.png

image.png

  • new做了啥 创建一个新对象; 将构造函数的作用域赋给新对象(this就指向了这个新对象); 执行构造函数中的代码(为这个新对象添加属性); 返回新对象。
  • 常见继承(class ... extends) 子构造函数父构造.call(this),缺点只能继承父构造函数内属性,不能继承原型对象上的内容;让子.prototype = new 父构造(),缺点兄弟实例改变父属性互相影响;组合继承,子构中父构.call(this),子构.prototype=Object.create(父构.prototype);子构.prototype.constructor=Child3

Event-loop

Js单线程执行,同步代码依次执行,异步代码挂起,在异步队列中,在同步代码执行完毕之后轮询执行异步代码

先微任务 后 宏任务 宏:setTimeout/setInterval 微:process.nextTick Promise

节流(时间内多次出发,间隔固定时间执行)防抖(时间内多次触发执行一次)

Vue

谈谈MVVM的理解

View视图层,Model数据,ViewModel层是将两者连接起来的桥梁,Model的数据通过数据绑定在视图上展示,View通过事件监听影响Model,响应式的视图进行更新;其中响应式的核心api是(Object.defineProperty或者Proxy);整体实现原理中有三个重要组成部分:模板编译Compile,数据劫持Observer,数据观察Watcher; 整体流程大致是创建Vue实例之后,由Compile去处理模板指令和插值表达式以及非html标签(组件标签)等,由Observer拦截需要响应式的data数据创建对应的watcher由依赖管理Dep来管理,Dep主要作用是收集watcher在劫持数据发生改变后通知watcher,watcher再通知Compile更新视图

生命周期

创建前后,挂载前后,更新前后,销毁前后。父先再子,子成再父

组件通信

  • 属性传递事件触发,自定义事件bus,vuex

插槽

  • 匿名插槽,具名插槽(slot标签定义name,然后在tamplete标签v-slot:name使用),作用域插槽(当父组件想使用子组件的变量时,slot通过动态属性暴露变量,tamplete标签v-slot=“xx”接收)

啥是动态组件如何异步加载

  • 动态组件 <component :is="组件名"></component>
  • 异步加载 components:{bar:()=>import('./bar.vue')}

vue2支持的数组方法,如何实现的

  • push pop shift unshift , splice, sort, reverse
  • Object.defineProperty对数组支持有缺陷;所以:const arrayPrototype=Object.create({Array.prototype}),重写方法

聊聊Virtual DOM

虚拟DOM是指一个描述DOM结构的js对象,表明是具体什么标签如div,具有哪些props,节点有哪些。因为浏览器操作DOM的成本较高,所以当数据变化是先通过比较虚拟DOM,匹配找出尽可能少的需要更新的真实DOM,从而达到提升性能的目的。

diff 同级比较深度优先

Vuex使用

mapActions/mapMutations/mapState image.png

key

作为循环的标识,便于diff时比较,使用id,不推荐用index

路由原理、守卫

  • window.onpopstate,window.onHashChange

image.png

Vue中涉及的优化

  • 合理利用计算属性(缓存机制)
  • 合理的v-if与v-show
  • keep-alive
  • 保证key的唯一性
  • 路由和组件的异步加载
  • ui库的按需引入
  • 避免v-for绑定事件 使用事件代理

React

聊聊vue与react的区别

生命周期

image.png

类组件和函数组件

类组件有自己的state和生命周期,适合做一些逻辑处理,函数组件是接受props,没有state和证明周期也被叫做木偶组件或者无状态组件,更适合单纯的样式展示

setState何时同步

定时器或者原生js绑定事件

react如何双向输入绑定

<input value={this.state.value} onChange={this.handleChange.bind(this)}></input>

高阶组件

接受一个组件并返回一个新组件的函数

react-redux如何使用

image.png

浏览器相关

输入URL回车

image.png

get与post

  • GET产生一个TCP数据包;POST产生两个TCP数据包
  • GET是header和data一并发送,POST分两次第一次header响应100,然后再继续
  • 参数一个是url长度受限一个是请求体
  • GET被浏览器主动cache,后退无害,POST不会,有害
  • GET只接受ASCII字符,而POST没有限制