2019前端面试题及答案

HTML——CSS——JS——es6——Vue——微信小程序

HTML面试题

1.请至少写出5个HTML块级元素标签。

div,p,form,table,h1~h6

2.请至少写出5个行内元素标签。

span,img,input,button,a

3.写出空元素。

br,hr,link

4.写出table标签下包含哪些标签元素。

tr,th,td,tfoot,tbody

5.很多网站不用iframe,table这两个元素,为什么?

因为浏览器页面渲染从上向下加载的,用iframe和table这两个标签要先加载这两个标签的内容,加载完成在整体加载然后渲染,用户体验效果不好。

6.jpg和png的区别。

png:压缩比高,色彩好。

jpg:在www网站,用来存储和传输照片的格式

7.至少写出5个HTML5的新标签。

header,footer,nav,section,video

8.a标签在新窗口打开链接怎么加属性。

9.写了2个标签,两个标签之间有空格的情况怎么解决。

将2个标签写在一行里

10.DOCTYPE有什么作用?

告诉浏览器使用哪个版本的HTML文档渲染页面

11.页面导入样式时,link与import的区别。

(1)link方式的样式权重比import的权重高。

(2  import在html使用时需要

  (3) link支持js可以改变样式,而import不支持

12.如何区分html和html5。

(1)DOCTYPE的声明方式

(2)根据新增加的结构,功能来区分

13.无样式内容闪烁?(FOUC)Flash Of Unstyle Content

@import导入css文件会等到文档加载完成后再加载CSS样式,因此,在页面DOM加载完成到CSS导入完成之间会有一段时间页面上的内容是没有样式的。

解决方法:使用link标签加载CSS样式文件。因为link是顺序加载的,这样的页面会等到CSS加载完成后再下载HTML文件,这样先布局好,然后就不会出现FOUC的问题了。

CSS面试题

JS面试题

VUE面试题

-------------------

vue中更新版本/升级添加版本号/项目升级/打包部署/等

1.对MVVM的理解

M:model层,在model层对数据进行操作和修改数据

V:View(视图层)

VM:ViewModel监听模型数据的改变和控制视图行为。相当于模型层和视图层的一个桥梁,起连接作用。

在MVVM模式下,View和Modal没有直接的联系,而是通过ViewModal进行交互,Modal和ViewModal之间是交互是双向的,因此View数据的变化会同步到Modal上,Modal数据的变化也会立即反应到View上。

ViewModal通过数据双向绑定把View和Modal层连接起来,而View和Modal之间的工作同步是完全自动的,无需别人干涉,因此开发者只关注业务逻辑,不需要动手操作DOM,不需要关注状态的同步问题,复杂的数据状态完全由MVVM管理

2.生命周期:Vue实例从创建到销毁的过程。从开始创建,初始化数据,编译模板,挂载DOM->渲染,更新->渲染,销毁等一系列过程。

beforeCreate(创建前):只是单纯的创建$el和data,数据观测和初始化时间还未开始(自己理解:$el和data都只是创建)

created(创建后):完成数据观测,属性和方法的运算,初始化事件(data),但是$el属性还没有显示出来(自己理解:data初始化完成,$el仍只是创建)

beforeMounte(挂载前):在挂载开始之前被调用,相关的render函数首次被调用。实例已完成以下的配置:编译模板,把data里面的数据和模板生成html。注意此时还没有挂载html到页面上。(自己理解:vue实例的$el和data都初始化了,但还是挂载之前未虚拟的DOM节点,data尚未替换。)

此时还没有挂载html在页面上。

mounted(载入后):在el被创建的vm.$el替换,并挂载到实例上去之后调用。实例已完成以下的配置。用上面编译好的html内容替换el属性指向DOM对象。完成模板的html渲染到html页面上。此过程是ajax交互过程(自己理解:用真实数据替换虚拟DOM)

beforeUpdate(更新前): 重新渲染之前触发(自己理解:data数据已经发生改变,但是未渲染)

updated(更新后):数据已经更改完成,dom也重新render完成,更改数据会陷入死循环(自己理解:data数据已经发生改变,并且旧数据代替新数据)

beforeDestory(销毁前):在实例销毁之前调用。实例仍然完全可用

destoryed(销毁后):在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。

(1).生命周期的作用?

生命周期有很多钩子函数,通过钩子函数让我们在控制整个Vue实例的过程时更容易形成好的逻辑。

(2).生命周期总共有几个阶段?

8个,创建前/后;载入前/后;更新前/后;销毁前/后

(3).第一次页面加载会出发那几个钩子?

beforeCreate, created, beforeMount, mounted 

(4).DOM渲染在哪个周期已经完成?

mounted

(5)简单描述每个周期具体适合那些场景?

beforeCreate:可以在这个上加loading事件,在加载实例时触发

created:初始化完成时的事件写在这里,如在这结束loading事件,异步请求也适合在这里调用

mounted:挂载元素,获取到DOM节点

updated:如果对数据统一处理,在这里协商相应函数

beforeDestory:可以做确认停止事件的确认框

nextTick:更新数据后立即操作dom

3.VUE双向绑定原理

采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter/getter,在数据发生变化时发布消息给订阅者,出发相应的监听回调。

具体步骤:

第一步:需要observe的数据对象进行递归遍历,包括子属性对象的属性,都加上setter和getter

这样的话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据的变化

第二步:compile解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图

第三步:Watcher订阅者是Observer和Compile之间通信的桥梁,主要做的事情是:

1.在自身实例化时往属性订阅器(dep)里面添加自己

2.自身必须有一个update()方法

3.待属性变动dep.motice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调,则功成身退。

第四步:MVVM作为数据绑定的入口,整合Observer、Compile和Watcher三者,通过Observer来监听自己的model数据变化,通过Compile来解析编译模板指令,最终利用Watcher搭起Observer和Compile之间的通信桥梁,达到数据变化 -> 视图更新;视图交互变化(input) -> 数据model变更的双向绑定效果。
4.Vue组件间的参数传递

父传子:props(接收值)

子传父:$emit(通过子组件绑定事件把参数传给父组件)

兄弟:vuex

5.Vue的路由实现:hash模式和history模式

hash模式:在浏览器中符号“#”,#以及#后面的字符称之为hash,用window.location.hash读取

特点:hash虽然在URL中,但不被包括在HTTP请求中;用来指导浏览器动作,对服务器安全无用,hash不会重加载页面

hash模式下,hash符号之前的内容会被包含在请求中。如 http://www.xxx.com,因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回 404 错误。

history模式:它采用的是HTML5的新特性;且提供了2个新方法:pushState(),replaceState()可以对浏览器历史记录栈进行修改,以及popState事件的监听状态变更。history模式下,前端URL必须和实际向后端发起请求的URL一致,如http://www.xxx.com/items/id。后端如果缺少对 /items/id 的路由处理,将返回 404 错误。

6.Vue与React的区别?

相同点:

React采用特殊的JSX语法,Vue.js在组件开发中也推崇编写.vue特殊文件格式,对文件内容都有一些约定,两者都需要编译后使用;中心思想相同:一切都是组件,组件实例之间可以嵌套;都提供合理的钩子函数,可以让开发者定制化地去处理需求;

不同点:

React采用的Virtual DOM会对渲染出来的结果做脏检查;Vue.js在模板中提供了指令,过滤器等,可以非常方便,快捷地操作Virtual DOM。

7.vue的优点是什么?

可重用性:可以将公共部分抽取出组件

低耦合。使用了双向绑定原理

8.路由之间跳转

声明式(标签跳转

编程式(js跳转router.push(‘/home’))

10.如何自定义组件?

(1)在页面引入   import

(2)注册组件     compoment

(3)在