web前端面试题

1.HTML篇

1.Html5 新增的语义化标签有哪些,已及他们的优点

答:
    1.提升可访问性 
    2.seo
    3.结构清晰,利于维护
    Header页面头部 main页面主要内容 footer页面底部
    Nav导航栏 aside侧边栏 article加载页面一块独立内容
    Section相当于div  figure加载独立内容(上图下字) figcaption  figure的标题
    Hgroup标题组合标签 mark高亮显示 dialog 加载对话框标签(必须配合open属性)
    Embed加载插件的标签 video加载视频 audio加载音频(支持格式ogg,mp3,wav)

2.的title和alt有什么区别?
答:
    1、alt: 图片加载失败时,显示在网页上的替代文字
    2、title: 鼠标放在上面时显示的文字
    3、alt 是必要属性,title 非必要

3.WEB标准以及W3C标准是什么?
答:
    1、标签闭合
    2、标签小写
    3、嵌套正确
    4、外部链接css和js
    5、提倡结构、表现和行为相分离(HTML结构、CSS表现、JavaScript行为)

4.HTML5 为什么只需要写 ?
答: 是文档类型声明,它声明了文档类型为html5,告诉浏览器和其他开发者,该文档使用的是html5标准

5.Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?
答:
   1.  声明位于文档中的最前面,处于  标签之前。告知浏览器以何种模式来渲染文档。 
   2. 严格模式的排版和 JS 运作模式是  以该浏览器支持的最高标准运行。
   3. 在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。
   4. DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。

2.css篇

1.盒子水平锤子居中的方法有几种
 答:
      方法一
      父元素{
              position:relative;
      }
      子元素{
            position:absolute;
            left:50%;
            top:50%;
            transform: translate(-50%,-50%);
      }
      方法二
      父元素{
             display: flex;
            justify-content: center;
            align-items: center;
        }
      方法3
      父元素{
              text-aling:cneter;
              height:50px;
              line-height:50px;
      }
      子元素{
            display:inline-block;//inline;
      }
2.阐述清楚浮动的几种方式
答:
      1、浮动的产生
      float: left/right(设置后产生浮动)
      初衷:浮动原先的设计初衷是为了实现文字环绕效果
      结果:父元素高度塌陷,理解起来就是元素浮动飘起来了,失去高度,下面的元素会顶上来,就造成了原            有的元素背景不见了,margin/padding也不能正常显示

      2、解决浮动的方法
      (1)clear: both,在元素最后下加一个元素设置clear:both属性,缺点是会增加多余无用的html元素
      
left浮动
right浮动
(2)使用after伪元素 .box 父元素 .box::after { content: ' '; display: block; clear: both; } (3)给父元素设置明确的高度,缺点是并不是所有元素的高度都是固定 (4)给父级元素设置overflow:hidden, 缺点:不能和position配合使用 3.请简要描述margin重合问题,及解决方式 答: 问题:相邻两个盒子垂直方向上的margin会发生重叠,只会取比较大的margin 解决:(1)设置padding代替margin (2)设置float (3)设置overflow (4)设置position:absolute 绝对定位 (5)设置display: inline-block 4.为什么要初始化css样式? 答:因为浏览器的兼容问题,不同浏览器对有些标签的默认值不同,如果不初始化css,会导致不同浏览器页面间的显示差异。 5.移动端适配1px问题 答:伪类+transform方法,原理是把原先元素的border去掉,然后利用伪类重做border,并transform的scale缩小一半,原先的元素相对定位,伪类元素绝对定位 6.重绘和回流(哪些情况重绘,哪些回流) 答; 重绘:不会影响页面布局的操作,比如更改颜色 回流:布局的改变导致需要重新构建就是回流 回流必将引起重绘,重绘不一定引起回流 7.居中为什么要使用transform(为什么不使用marginLeft/Top) transform 属于合成属性,不会引起整个页面的回流重绘,节省性能消耗,但是占用内存会大些 top/left属于布局属性,会引起页面layout回流和repaint重绘。 8.link和@import的区别 答: 区别 1.从属关系区别 @import是 CSS 提供的语法规则,只有导入样式表的作用;link是HTML提供的标签,不仅可以加载 CSS 文件,还可以定义 RSS、rel 连接属性等。 2.加载顺序区别 加载页面时,link标签引入的 CSS 被同时加载;@import引入的 CSS 将在页面加载完毕后被加载。 3.兼容性区别 @import是 CSS2.1 才有的语法,故只可在 IE5+ 才能识别;link标签作为 HTML 元素,不存在兼容性问题。 4.DOM可控性区别 可以通过 JS 操作 DOM ,插入link标签来改变样式;由于 DOM 方法是基于文档的,无法使用@import的方式插入样式。 5.权重区别(该项有争议,下文将详解) link引入的样式权重大于@import引入的样式。 结论:强烈建议使用link标签,慎用@import方式。 这样可以避免考虑@import的语法规则和注意事项,避免产生资源文件下载顺序混乱和http请求过多的烦恼。 9、在网页中的应该使用奇数还是偶数的字体?为什么呢? 答:偶数字体,因为使用奇数号字体不好的地方是,文本段落无法对齐。 10.介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的? 答:盒子模型由四个属性组成的外边距(margin)、内边距(padding)、边界(border)、内容区(width和height); 标准的CSS盒子模型和低端IE CSS盒子模型不同:宽高不一样 标准的css盒子模型宽高就是内容区宽高; 低端IE css盒子模型宽高 内边距﹢边界﹢内容区;

js篇

1.es6的新特性
答:const let
模板字符串
箭头函数
函数的参数默认值
对象和数组解构
for...of 和 for...in

2.原型链和作用域链的区别
答:
(1)原型链
当访问一个对象的某个属性时,会先在这个对象本身的属性上找,如果没有找到,会去这个属性的__proto__属性上找,即这个构造函数的prototype,如果还没找到,就会继续在__proto__上查找,
直到最顶层,找不到即为undefined。这样一层一层往上找,彷佛是一条链子串起来,所以叫做原型链。

(2)作用域链
变量取值会到创建这个变量的函数的作用域中取值,如果找不到,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。

(3)区别
作用域是对变量而言,原型链是对于对象的属性而言
作用域链的顶层是window,原型链的顶层是Object

3.js数据类型有哪些,js判断类型的方法有哪些
答:原始数据类型Undefined、Null、Boolean、Number和String和一种引用类型Object,Object本质是一组无序的名值对组成的
      判断类型的方法
      1、typeof
      检测不出null 和 数组,结果都为object,所以typeof常用于检测基本类型

      2、instanceof
      不能检测出number、boolean、string、undefined、null、symbol类型,所以instancof常用于检测复杂类型以及级成关系

     3、constructor
      null、undefined没有construstor方法,因此constructor不能判断undefined和null。
但是contructor的指向是可以被改变,所以不安全

      4、Object.prototype.toString.call
      全类型都可以判断
4.普通函数和箭头函数的区别
答:1、普通函数
        可以通过bind、call、apply改变this指向
        可以使用new

        2、箭头函数
        本身没有this指向,
       它的this在定义的时候继承自外层第一个普通函数的this
       被继承的普通函数的this指向改变,箭头函数的this指向会跟着改变
       箭头函数外层没有普通函数时,this指向window
       不能通过bind、call、apply改变this指向
      使用new调用箭头函数会报错,因为箭头函数没有constructor

5.如何用原生js给一个按钮绑定两个onclick事件?
答:addEventListener绑定

6.document.write和innerHTML的区别
document.write 将内容写入页面,清空替换掉原来的内容,会导致重绘
document.innerHTML 将内容写入某个Dom节点,不会重绘

7.栈和堆的区别
答:1、堆
    动态分配内存,内存大小不一,也不会自动释放
    2、栈
    自动分配相对固定大小的内存空间,并由系统自动释放
    3、基本类型都是存储在栈中,每种类型的数据占用的空间的大小是确定的,并由系统自动分配和释放。内存可以及时回收。
    4、引用类型的数据都是存储在堆中。准确说是栈中会存储这些数据的地址指针,并指向堆中的具体数据。

8.undefined 和 null 区别
答:null已定义,值为空,undefined声明了一个变量,但没有赋值

9.JS哪些操作会造成内存泄露
答:内存泄漏是指一块被分配的内存既不能使用,也不能回收,直到浏览器进程结束。
    1、意外的全局变量
    2、闭包
    3、没有清理的dom元素
    dom元素赋值给变量,又通过removeChild移除dom元素。但是dom元素的引用还在内存中
    4、被遗忘的定时器或者回调

10.谈谈垃圾回收机制方式及内存管理
答:JavaScript 在定义变量时就完成了内存分配。当不在使用变量了就会被回收,因为其开销比较大,垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。
    (1)垃圾回收
    标记清除法
    当变量进入环境时,将这个变量标记为'进入环境'。当标记离开环境时,标记为‘离开环境’。离开环境的变量会被回收
    引用技计数法
    跟踪记录每个值被引用的次数,如果没有被引用,就会回收
    (2)内存管理
    内存分配=》内存使用=》内存回收

11.请解释一下JavaScript的同源策略
答:同源指协议,域名,端口相同,
同源策略是一种安全协议,指一段脚本只能读取来自同一来源的窗口和文档的属性。

12.关于JS事件冒泡与JS事件代理(事件委托)
答:(1)事件冒泡
    当一个元素接收到事件的时候 会把他接收到的事件传给自己的父级,一直到window,过程就像冒泡泡 。如果在某一层想要中止冒泡,使用 event.stopPropagation() 。
但是当大量标签大量事件的时候先然不可能为每个元素都加上事件,(事件绑定占用事件,浏览器要跟踪每个事件,占用更多内存。而且并不是所有事件都会被用户使用到)。所以需要事件委托来解决这个问题。
    (2)事件委托
    将事件给最外层的元素,自己不实现逻辑,由最外层元素来代理。(判断事件源,做不同处理)

13.JS为什么要区分微任务和宏任务
答:
(1)js是单线程的,但是分同步异步
(2)微任务和宏任务皆为异步任务,它们都属于一个队列
(3)宏任务一般是:script,setTimeout,setInterval、setImmediate
(4)微任务:原生Promise
(5)遇到微任务,先执行微任务,执行完后如果没有微任务,就执行下一个宏任务,如果有微任务,就按顺序一个一个执行微任务
14.客户端浏览器一次http完整请求过程
1):DNS解析域名得到IP地址
2):客户端与服务器建立连接(TCP三次握手)
3):客户端发起请求
4):服务器接收到请求根据端口号.路径等找到对应资源文件,响应源代码给客户端
5):客户端拿到请求到的数据(html页面的源代码),开始解析页面以及请求资源
6):客户端渲染页面
7):web服务器断开连接(四次挥手)
TCP三次握手
第一次握手:客户端发送一个带 SYN=1,Seq=X 的数据包到服务器端口(第一次握手,由浏览器发起,告诉服务器我要发送请求了) 
第二次握手服务器发回一个带 SYN=1, ACK=X+1, Seq=Y 的响应包以示传达确认信息(第二次握手,由服务器发起,告诉浏览器我准备接受了,你赶紧发送吧) 
第三次握手:客户端再回传一个带 ACK=Y+1, Seq=Z 的数据包,代表“握手结束”(第三次握手,由浏览器发送,告诉服务器,我马上就发了,准备接受吧)
TCP四次挥手
第一次挥手:发起方向被动方发送报文,Fin、Ack、Seq,表示已经没有数据传输了。并进入 FIN_WAIT_1 状态。(第一次挥手:由浏览器发起的,发送给服务器,我请求报文发送完了,你准备关闭吧)

第二次挥手:被动方发送报文,Ack、Seq,表示同意关闭请求。此时主机发起方进入 FIN_WAIT_2 状态。(第二次挥手:由服务器发起的,告诉浏览器,我请求报文接受完了,我准备关闭了,你也准备吧)

第三次挥手:被动方向发起方发送报文段,Fin、Ack、Seq,请求关闭连接。并进入 LAST_ACK 状态。(第三次挥手:由服务器发起,告诉浏览器,我响应报文发送完了,你准备关闭吧)

第四次挥手:发起方向被动方发送报文段,Ack、Seq。然后进入等待 TIME_WAIT 状态。被动方收到发起方的报文段以后关闭连接。发起方等待一定时间未收到回复,则正常关闭。(第四次挥手:由浏览器发起,告诉服务器,我响应报文接受完了,我准备关闭了,你也准备吧)
15.浏览器渲染过程
1.根据 HTML 解析出 DOM 树
2.根据 CSS 解析生成 CSS 规则树
3.结合 DOM 树和 CSS 规则树,生成渲染树
4.根据渲染树计算每一个节点的信息
5.根据计算好的信息绘制页面
1)根据 HTML 解析 DOM 树
根据 HTML 的内容,将标签按照结构解析成为 DOM 树,DOM 树解析的过程是一个深度优先遍历。即先构建当前节点的所有子节点,再构建下一个兄弟节点。在读取 HTML 文档,构建 DOM 树的过程中,若遇到 script 标签,则 DOM 树的构建会暂停,直至脚本执行完毕。

2)根据 CSS 解析生成 CSS 规则树
解析 CSS 规则树时 js 执行将暂停,直至 CSS 规则树就绪。浏览器在 CSS 规则树生成之前不会进行渲染。

3)结合 DOM 树和 CSS 规则树,生成渲染树
DOM 树和 CSS 规则树全部准备好了以后,浏览器才会开始构建渲染树。精简 CSS 并可以加快 CSS 规则树的构建,从而加快页面相应速度。

4)根据渲染树计算每一个节点的信息(布局)
布局:通过渲染树中渲染对象的信息,计算出每一个渲染对象的位置和尺寸
回流:在布局完成后,发现了某个部分发生了变化影响了布局,那就需要倒回去重新渲染。

5)根据计算好的信息绘制页面
绘制阶段,系统会遍历呈现树,并调用呈现器的“paint”方法,将呈现器的内容显示在屏幕上。
重绘:某个元素的背景颜色,文字颜色等,不影响元素周围或内部布局的属性,将只会引起浏览器的重绘。
回流:某个元素的尺寸发生了变化,则需重新计算渲染树,重新渲染。

16.HTTP状态码分类
1xx 客户端提出请求,等待服务器处理
2xx 成功
3xx 重定向(登录完之后,直接跳到指定界面)
4xx 客户端错
5xx 服务端错
1xx
这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。

2xx
这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。

3xx
这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 location 域中指明。

4xx
这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个 HEAD 请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。

5xx
这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD 请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。

200 OK:服务器成功处理了请求(这个是我们见到最多的)

301 Moved Permanently:资源移动。所请求资源自动到新的URL,浏览器自动跳转到新的URL

304 Not Modified:服务端的资源与客户端上一次请求的一致,不需要重新传输,客户端使用本地缓存的即可

400 Bad Request:用于告诉客户端它发送了一个错误的请求

404 Not Found:(页面丢失)未找到资源

500 Internal Server Error:服务器内部出现了错误

501 Internal Server Error:服务器遇到一个错误,使其无法对请求提供服务

vue篇

vue工作原理
***把一个普通对象传给 Vue 实例作为它的 data 选项,Vue.js 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter。这是 ES5 特性,不能打补丁实现,这便是为什么 Vue.js 不支持 IE8 及更低版本。
1.Observer利用Object.defineProperty,将要观察的对象(data),转化成getter/setter,以便拦截对象赋值与取值操作
2.Compiler需要将DOM解析,提取其中的指令与占位符,并赋与不同的操作
3.Watcher需要将Compile的解析结果,与Observer所观察的对象连接起来,建立关系,在Observer观察到对象数据变化时,接收通知,同时更新DOM
4.最后,需要一个公共入口对象,接收配置,协调上述三者,称为Vue;

1.vue优点?
答:轻量级框架:只关注视图层,是一个构建数据的视图集合,大小只有几十kb;
简单易学:国人开发,中文文档,不存在语言障碍 ,易于理解和学习;
双向数据绑定:保留了angular的特点,在数据操作方面更为简单;
组件化:保留了react的优点,实现了html的封装和重用,在构建单页面应用方面有着独特的优势;
视图,数据,结构分离:使数据的更改更为简单,不需要进行逻辑代码的修改,只需要操作数据就能完成相关操作;
虚拟DOM:dom操作是非常耗费性能的, 不再使用原生的dom操作节点,极大解放dom操作,但具体操作的还是dom不过是换了另一种方式;
运行速度更快:相比较与react而言,同样是操作虚拟dom,就性能而言,vue存在很大的优势。

2.vue父组件向子组件传递数据?子组件像父组件传递事件?
答:props,$emit

3.v-show和v-if指令的共同点和不同点?
答: 共同点:都能控制元素的显示和隐藏;
不同点:实现本质方法不同,v-show本质就是通过控制css中的display设置为none,控制隐藏,只会编译一次;v-if是动态的向DOM树内添加或者删除DOM元素,若初始值为false,就不会编译了。而且v-if不停的销毁和创建比较消耗性能。
总结:如果要频繁切换某节点,使用v-show(切换开销比较小,初始开销较大)。如果不需要频繁切换某节点使用v-if(初始渲染开销较小,切换开销比较大)。

4.为什么使用key?
答:需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点。
作用主要是为了高效的更新虚拟DOM。

5.v-modal的使用。
答:v-model用于表单数据的双向绑定,其实它就是一个语法糖,这个背后就做了两个操作:
v-bind绑定一个value属性;
v-on指令给当前元素绑定input事件。

6.分别简述computed和watch的使用场景
答:computed:
    当一个属性受多个属性影响的时候就需要用到computed
    最典型的栗子: 购物车商品结算的时候
watch:
    当一条数据影响多条数据的时候就需要用watch
    栗子:搜索数据

7.$nextTick的使用
答:当你修改了data的值然后马上获取这个dom元素的值,是不能获取到更新后的值,
你需要使用$nextTick这个回调,让修改后的data值渲染更新到dom元素之后在获取,才能成功。

8.vue组件中data为什么必须是一个函数?
答:因为JavaScript的特性所导致,在component中,data必须以函数的形式存在,不可以是对象。
  组建中的data写成一个函数,数据以函数返回值的形式定义,这样每次复用组件的时候,都会返回一份新的data,相当于每个组件实例都有自己私有的数据空间,它们只负责各自维护的数据,不会造成混乱。而单纯的写成对象形式,就是所有的组件实例共用了一个data,这样改一个全都改了。

9.Vue中双向数据绑定是如何实现的?
答:vue 双向数据绑定是通过 数据劫持 结合 发布订阅模式的方式来实现的, 也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变;
核心:关于VUE双向数据绑定,其核心是 Object.defineProperty()方法。

10.单页面应用和多页面应用区别及优缺点
答:单页面应用(SPA),通俗一点说就是指只有一个主页面的应用,浏览器一开始要加载所有必须的 html, js, css。所有的页面内容都包含在这个所谓的主页面中。但在写的时候,还是会分开写(页面片段),然后在交互的时候由路由程序动态载入,单页面的页面跳转,仅刷新局部资源。多应用于pc端。
多页面(MPA),就是指一个应用中有多个页面,页面跳转时是整页刷新
单页面的优点:
用户体验好,快,内容的改变不需要重新加载整个页面,基于这一点spa对服务器压力较小;前后端分离;页面效果会比较炫酷(比如切换页面内容时的专场动画)。
单页面缺点:
不利于seo;导航不可用,如果一定要导航需要自行实现前进、后退。(由于是单页面不能用浏览器的前进后退功能,所以需要自己建立堆栈管理);初次加载时耗时多;页面复杂度提高很多。

11.Vue2中注册在router-link上事件无效解决方法
答: 使用@click.native。原因:router-link会阻止click事件,.native指直接监听一个原生事件。

12.axios的特点有哪些
答:从浏览器中创建XMLHttpRequests;
node.js创建http请求;
支持Promise API;
拦截请求和响应;
转换请求数据和响应数据;
取消请求;
自动换成json。
缺点
。对搜索引擎不友好
。 要实现Ajax下的前后退功能成本较大
。跨域问题限制
axios中的发送字段的参数是data跟params两个,两者的区别在于params是跟请求地址一起发送的,data的作为一个请求体进行发送
params一般适用于get请求,data一般适用于post put 请求。

13.什么是 vue 生命周期?有什么作用?
答:每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做 生命周期钩子 的函数,这给了用户在不同阶段添加自己的代码的机会。(ps:生命周期钩子就是生命周期函数)例如,如果要通过某些插件操作DOM节点,如想在页面渲染完后弹出广告窗, 那我们最早可在mounted 中进行。
beforeCreate:在new一个vue实例后,只有一些默认的生命周期钩子和默认事件,其他的东西都还没创建。在beforeCreate生命周期执行的时候,data和methods中的数据都还没有初始化。不能在这个阶段使用data中的数据和methods中的方法
create:data 和 methods都已经被初始化好了,如果要调用 methods 中的方法,或者操作 data 中的数据,最早可以在这个阶段中操作
beforeMount:执行到这个钩子的时候,在内存中已经编译好了模板了,但是还没有挂载到页面中,此时,页面还是旧的
mounted:执行到这个钩子的时候,就表示Vue实例已经初始化完成了。此时组件脱离了创建阶段,进入到了运行阶段。 如果我们想要通过插件操作页面上的DOM节点,最早可以在和这个阶段中进行
beforeUpdate: 当执行这个钩子时,页面中的显示的数据还是旧的,data中的数据是更新后的, 页面还没有和最新的数据保持同步
updated:页面显示的数据和data中的数据已经保持同步了,都是最新的
beforeDestory:Vue实例从运行阶段进入到了销毁阶段,这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于可用状态。还没有真正被销毁
destroyed: 这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于不可用状态。组件已经被销毁了。

14.created和mounted的区别
答:created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图。
mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作。

15.请详细说下你对vue生命周期的理解?
总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后。
创建前/后: 在beforeCreated阶段,vue实例的挂载元素$el和**数据对象**data都为undefined,还未初始化。在created阶段,vue实例的数据对象data有了,$el还没有。
载入前/后:在beforeMount阶段,vue实例的$el和data都初始化了,但还是挂载之前为虚拟的dom节点,data.message还未替换。在mounted阶段,vue实例挂载完成,data.message成功渲染。
更新前/后:当data变化时,会触发beforeUpdate和updated方法。
销毁前/后:在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在。

16.mvvm 框架是什么?
答:vue是实现了双向数据绑定的mvvm框架,当视图改变更新模型层,当模型层改变更新视图层。在vue中,使用了双向绑定技术,就是View的变化能实时让Model发生变化,而Model的变化也能实时更新到View。

17.vue-router的两种模式
答:hash模式:即地址栏 URL 中的 # 符号;
history模式:window.history对象打印出来可以看到里边提供的方法和记录长度。利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(需要特定浏览器支持)。

18.vuex是什么?怎么使用?哪种功能场景使用它?
答:vue框架中状态管理。在main.js引入store,注入。
vuex有五种属性,分别是 State、 Getter、Mutation 、Action、 Module
state => 基本数据(数据源存放地)
getters => 从基本数据派生出来的数据
mutations => 提交更改数据的方法,同步!
actions => 像一个装饰器,包裹mutations,使之可以异步。
modules => 模块化Vuex
场景有:单页应用中,组件之间的状态。音乐播放、登录状态、加入购物车

React 面试题

1.区分Real DOM和Virtual DOM
Real DOM                                      Virtual DOM
1. 更新缓慢。                              1. 更新更快。
2. 可以直接更新 HTML。                    2. 无法直接更新 HTML。
3. 如果元素更新,则创建新DOM。             3. 如果元素更新,则更新 JSX 。
4. DOM操作代价很高。                      4. DOM 操作非常简单。
5. 消耗的内存较多。                       5. 很少的内存消耗。

2. 什么是React
React 是 Facebook 在 2011 年开发的前端 JavaScript 库。它遵循基于组件的方法,有助于构建可重用的UI组件。它用于开发复杂和交互式的 Web 和移动 UI。尽管它仅在 2015 年开源,但有一个很大的支持社区。
3.React有什么特点
它使用**虚拟DOM **而不是真正的DOM。它可以用服务器端渲染。它遵循单向数据流或数据绑定。

4.React的一些主要优点
1)它提高了应用的性能
2)可以方便地在客户端和服务器端使用
3)由于 JSX,代码的可读性很好
4)React 很容易与 Meteor,Angular 等其他框架集成
5)使用React,编写UI测试用例变得非常容易

5.React有哪些限制
1)React 只是一个库,而不是一个完整的框架
2)它的库非常庞大,需要时间来理解
3)新手程序员可能很难理解
4)编码变得复杂,因为它使用内联模板和 JSX

6.什么是JSX
JSX 是J avaScript XML 的简写。是 React 使用的一种文件,它利用 JavaScript 的表现力和类似 HTML 的模板语法。这使得 HTML 文件非常容易理解。此文件能使应用非常可靠,并能够提高其性能

7.Virtual DOM工作原理
Virtual DOM 是一个轻量级的 JavaScript 对象,它最初只是 real DOM 的副本。它是一个节点树,它将元素、它们的属性和内容作为对象及其属性。 React 的渲染函数从 React 组件中创建一个节点树。然后它响应数据模型中的变化来更新该树,该变化是由用户或系统完成的各种动作引起的。
1)每当底层数据发生改变时,整个 UI 都将在 Virtual DOM 描述中重新渲染
2)然后计算之前 DOM 表示与新表示的之间的差异
3)完成计算后,将只用实际更改的内容更新 real DOM

8.为什么浏览器无法读取JSX
浏览器只能处理 JavaScript 对象,而不能读取常规 JavaScript 对象中的 JSX。所以为了使浏览器能够读取 JSX,首先,需要用像 Babel 这样的 JSX 转换器将 JSX 文件转换为 JavaScript 对象,然后再将其传给浏览器。

9.你理解“在React中,一切都是组件”这句话吗
组件是 React 应用 UI 的构建块。这些组件将整个 UI 分成小的独立并可重用的部分。每个组件彼此独立,而不会影响 UI 的其余部分。

10.解释 React 中 render() 的目的
每个React组件强制要求必须有一个 render()。它返回一个 React 元素,是原生 DOM 组件的表示。如果需要渲染多个 HTML 元素,则必须将它们组合在一个封闭标记内,例如 
等。此函数必须保持纯净,即必须每次调用时都返回相同的结果。 11.什么是 Props Props 是 React 中属性的简写。它们是只读组件,必须保持纯,即不可变。它们总是在整个应用中从父组件传递到子组件。子组件永远不能将 prop 送回父组件。这有助于维护单向数据流,通常用于呈现动态生成的数据 12.React中的状态是什么?它是如何使用的 状态是 React 组件的核心,是数据的来源,必须尽可能简单。基本上状态是确定组件呈现和行为的对象。与props 不同,它们是可变的,并创建动态和交互式组件。可以通过 this.state() 访问它们 13. React 中的箭头函数是什么?怎么用 箭头函数(=>)是用于编写函数表达式的简短语法。这些函数允许正确绑定组件的上下文,因为在 ES6 中默认下不能使用自动绑定。使用高阶函数时,箭头函数非常有用 14.区分状态State和 props 条件 State Props 1. 从父组件中接收初始值 Yes Yes 2. 父组件可以改变值 No Yes 3. 在组件中设置默认值 Yes Yes 4. 在组件的内部变化 Yes No 5. 设置子组件的初始值 Yes Yes 6. 在子组件的内部更改 No Yes 15.区分有状态和无状态组件 有状态组件 1. 在内存中存储有关组件状态变化的信息 2. 有权改变状态 3. 包含过去、现在和未来可能的状态变化情况 4. 接受无状态组件状态变化要求的通知,然后将 props 发送给他们。 无状态组件 1. 计算组件的内部的状态 2. 无权改变状态 3. 不包含过去,现在和未来可能发生的状态变化情况 4.从有状态组件接收 props 并将其视为回调函数。 16.React组件生命周期的阶段是什么 *初始渲染阶段:*这是组件即将开始其生命之旅并进入 DOM 的阶段。 *更新阶段:*一旦组件被添加到 DOM,它只有在 prop 或状态发生变化时才可能更新和重新渲染。这些只发生在这个阶段。 *卸载阶段:*这是组件生命周期的最后阶段,组件被销毁并从 DOM 中删除。 componentWillMount**()** – 在渲染之前执行,在客户端和服务器端都会执行。 componentDidMount**()** – 仅在第一次渲染后在客户端执行。 componentWillReceiveProps**()** – 当从父类接收到 props 并且在调用另一个渲染器之前调用。 shouldComponentUpdate**()** – 根据特定条件返回 true 或 false。如果你希望更新组件,请返回true 否则返回 false。默认情况下,它返回 false。 componentWillUpdate**()** – 在 DOM 中进行渲染之前调用。 componentDidUpdate**()** – 在渲染发生后立即调用。 componentWillUnmount**()** – 从 DOM 卸载组件后调用。用于清理内存空间。 17.React中的合成事件是什么 合成事件是围绕浏览器原生事件充当跨浏览器包装器的对象。它们将不同浏览器的行为合并为一个 API。这样做是为了确保事件在不同浏览器中显示一致的属性。 18.你对 React 的 refs 有什么了解 Refs 是 React 中引用的简写。它是一个有助于存储对特定的 React 元素或组件的引用的属性,它将由组件渲染配置函数返回。用于对 render() 返回的特定元素或组件的引用。当需要进行 DOM 测量或向组件添加方法时,它们会派上用场。使用场景:需要管理焦点、选择文本或媒体播放时;触发式动画;与第三方 DOM 库集成 19.什么是高阶组件(HOC) 高阶组件是重用组件逻辑的高级方法,是一种源于 React 的组件模式。 HOC 是自定义组件,在它之内包含另一个组件。它们可以接受子组件提供的任何动态,但不会修改或复制其输入组件中的任何行为。你可以认为 HOC 是“纯(Pure)”组件。 20.你能用HOC做什么 代码重用,逻辑和引导抽象 渲染劫持 状态抽象和控制 Props 控制 21.什么是纯组件 纯(Pure) 组件是可以编写的最简单、最快的组件。它们可以替换任何只有 render() 的组件。这些组件增强了代码的简单性和应用的性能。 22.React 中 key 的重要性是什么 key 用于识别唯一的 Virtual DOM 元素及其驱动 UI 的相应数据。它们通过回收 DOM 中当前所有的元素来帮助 React 优化渲染。这些 key 必须是唯一的数字或字符串,React 只是重新排序元素而不是重新渲染它们。这可以提高应用程序的性能。 23.MVC框架的主要问题是什么? 对 DOM 操作的代价非常高 程序运行缓慢且效率低下 内存浪费严重 由于循环依赖性,组件模型需要围绕 models 和 views 进行创建 24.解释一下 Flux Flux 是一种强制单向数据流的架构模式。它控制派生数据,并使用具有所有数据权限的中心 store 实现多个组件之间的通信。整个应用中的数据更新必须只能在此处进行。 Flux 为应用提供稳定性并减少运行时的错误。 25.什么是Redux? Redux 是当今最热门的前端开发库之一。它是 JavaScript 程序的可预测状态容器,用于整个应用的状态管理。使用 Redux 开发的应用易于测试,可以在不同环境中运行,并显示一致的行为。 26.Redux遵循的三个原则是什么 1)单一事实来源:***整个应用的状态存储在单个 store 中的对象/状态树里。单一状态树可以更容易地跟踪随时间的变化,并调试或检查应用程序。 2)状态是只读的:***改变状态的唯一方法是去触发一个动作。动作是描述变化的普通 JS 对象。就像 state 是数据的最小表示一样,该操作是对数据更改的最小表示。 3)使用纯函数进行更改:***为了指定状态树如何通过操作进行转换,你需要纯函数。纯函数是那些返回值仅取决于其参数值的函数。 总结:Redux 使用 “Store” 将程序的整个状态存储在同一个地方。因此所有组件的状态都存储在 Store 中,并且它们从 Store 本身接收更新。单一状态树可以更容易地跟踪随时间的变化,并调试或检查程序 组成: Action – 这是一个用来描述发生了什么事情的对象。 Reducer – 这是一个确定状态将如何变化的地方。 Store – 整个程序的状态/对象树保存在Store中。 View – 只显示 Store 提供的数据。 27.如何在 Redux 中定义 Action React 中的 Action 必须具有 type 属性,该属性指示正在执行的 ACTION 的类型。必须将它们定义为字符串常量,并且还可以向其添加更多的属性。在 Redux 中,action 被名为 Action Creators 的函数所创建。 28.Reducer 的作用 Reducers 是纯函数,它规定应用程序的状态怎样因响应 ACTION 而改变。Reducers 通过接受先前的状态和 action 来工作,然后它返回一个新的状态。它根据操作的类型确定需要执行哪种更新,然后返回新的值。如果不需要完成任务,它会返回原来的状态。 29.Store 在 Redux 中的意义是什么 Store 是一个 JavaScript 对象,它可以保存程序的状态,并提供一些方法来访问状态、调度操作和注册侦听器。应用程序的整个状态/对象树保存在单一存储中。因此,Redux 非常简单且是可预测的。我们可以将中间件传递到 store 来处理数据,并记录改变存储状态的各种操作。所有操作都通过 reducer 返回一个新状态。 30.Redux 有哪些优点 结果的可预测性 - 由于总是存在一个真实来源,即 store ,因此不存在如何将当前状态与动作和应用的其他部分同步的问题。 可维护性 - 代码变得更容易维护,具有可预测的结果和严格的结构。 服务器端渲染 - 你只需将服务器上创建的 store 传到客户端即可。这对初始渲染非常有用,并且可以优化应用性能,从而提供更好的用户体验。 开发人员工具 - 从操作到状态更改,开发人员可以实时跟踪应用中发生的所有事情。 社区和生态系统 - Redux 背后有一个巨大的社区,这使得它更加迷人。一个由才华横溢的人组成的大型社区为库的改进做出了贡献,并开发了各种应用。 易于测试 - Redux 的代码主要是小巧、纯粹和独立的功能。这使代码可测试且独立。 组织 - Redux 准确地说明了代码的组织方式,这使得代码在团队使用时更加一致和简单。 31.为什么React Router v4中使用 switch 关键字 虽然
** 用于封装 Router 中的多个路由,当你想要仅显示要在多个定义的路线中呈现的单个路线时,可以使用 “switch” 关键字。使用时,** 标记会按顺序将已定义的 URL 与已定义的路由进行匹配。找到第一个匹配项后,它将渲染指定的路径。从而绕过其它路线。 32.列出 React Router 的优点 1)就像 React 基于组件一样,在 React Router v4 中,API 是 ‘All About Components’。可以将 Router 可视化为单个根组件(),其中我们将特定的子路由()包起来。 2)无需手动设置历史值:在 React Router v4 中,我们要做的就是将路由包装在 组件中。 3)包是分开的:共有三个包,分别用于 Web、Native 和 Core。这使我们应用更加紧凑。基于类似的编码风格很容易进行切换。

你可能感兴趣的:(web前端面试题)