最近博主想换一个工作环境,于是自信满满的赶上了金三银四的好时候。殊不知外面的世界早于以前不同了,特别是前端这一块。

在开始之前申明一下,博主的公司一直用的技术栈是vue,期间也开发过两个小程序,相比较而言,原生js以及jquery的项目已经很久很久没做过了。

言归正传,放上这次面试题的题目:

css、html 方面:

1.css盒模型分为哪两种?

标准盒子模型 IE盒子模型,主要区别在于width计算。

2.选择器的优先级排序?

内联样式>id选择器>类选择器=属性选择器=伪类选择器>标签选择器=伪元素选择器

3.你知道哪些H5新标签?

header:定义文档的页眉 头部

nav:定义导航链接的部分

footer:定义文档或节的页脚 底部

article:定义文章。

section:定义文档中的节(section、区段)

aside:定义其所处内容之外的内容 侧边

4.display:flex;justify-content:center;align-items:center呈现的效果是什么样?

水平居中,垂直居中

5.什么情况需要清除浮动,如何清除?

有时候父容器没有给固定高度的时候,所以给浮动的元素的祖先元素加上高度;

clear:both;(这个方法有一个非常大的,并且致命的问题,margin失效了!)

overflow:hidden

6.行内元素,块级元素列举几个?

    块元素:独占一行,可设置宽高(div、p、ul、ol、h1-h5)
    行内块元素:可设置宽高,不能换行(img、iput)
    行元素:不能设置宽高,不能换行(span、i、s、u)

 

原生js方面:

1.解释下数组中的join()以及split()

join()是把数组中的所有元素放入字符串中,再用指定的分隔符进行分隔。

<script type="text/javascript">

var arr = new Array(3)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"

document.write(arr.join("."))

</script>

输出:

George.John.Thomas

split()是把字符串分隔成一个字符串数组。

它接受两个参数:

stringObject.split(separator,howmany)

例如:

<script type="text/javascript">

var str="How are you doing today?"

document.write(str.split(" ") + "<br />")
document.write(str.split("") + "<br />")
document.write(str.split(" ",3))

</script>

输出:

How,are,you,doing,today?
H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
How,are,you

2.数字转化为字符串有哪几种方法?

toString();String();" "+value

3.说一说闭包?优点?缺点?

闭包就是能够读取其他函数内部变量的函数,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成‘定义在函数内部的函数’,它就是将函数内部和函数外部链接起来的一座桥梁。由于闭包会使函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,解决方法是在退出函数之前将不使用的局部变量全部删除。

4.说一说call,bind,apply的相同与不同之处?

首先他们都是用来改变 this 指向的(其实我用的最多的是箭头函数,感觉更简洁一点)。

call 方法第一个参数是要绑定给this的值,后面传入的是一个参数列表。当第一个参数为 null、undefined 的时候,默认指向 window。

apply 接受两个参数,第一个参数是要绑定给 this 的值,第二个参数是一个参数数组。当第一个参数为 null、undefined 的时候,默认指向 window。

事实上 apply 和 call  的用法几乎相同, 唯一的差别在于:当函数需要传递多个变量时, apply 可以接受一个数组作为参数输入, call 则是接受一系列的单独变量。

bind 和 call 很相似,第一个参数是 this 的指向,从第二个参数开始是接收的参数列表。区别在于 bind 方法返回值是函数以及 bind 接收的参数列表的使用。

5.你常用哪些ES6新特性?

我简单的说了几个,比如const、let声明变量,他们与var声明的区别。

箭头函数,模板字符串还有解构赋值等等。

6.你了解原型和原型链吗?

关于这方面我一年前写过有关面向对象的内容,这里不做解释了。

 

vue方面:

 

1.说一说vue的生命周期?

beforeCreate()、created()、beforeMount()、mounted()、beforeUpdate()、updated()、beforeDestory()、

destroyed()

2.vue的组件通信几种方式?

父传子:props

子传父:emit

兄弟组件传递数据eventBus

具体实现不作解释了

3.keep-alive干嘛用的?

是vue的一个内置组件,可以使被包含的组件保留状态,避免重新被渲染

4.v-for循环中key的用处是什么?

key的作用主要是为了高效的更新虚拟DOM(有兴趣的可以看下虚拟DOM的Diff算法原理)

5.解释下双向绑定原理?

vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的settergetter,在数据变动时发布消息给订阅者,触发相应的监听回调。

1、实现一个数据监听器Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者
2、实现一个指令解析器Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数
3、实现一个Watcher,作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图
4、mvvm入口函数,整合以上三者

6.用过vuex吗?说一说工作流程?

vuex是对数据的集中式管理,在开发大中型项目需要很多公共数据的传递,我们就能通过状态管理来实现。

大体流程是在组建components中可以通过vuex中解构的mapActions方法发送请求到actions进行业务逻辑处理,然后actions通过commit方法和mutations进行通讯,由mutations修改state里边的数据状态。要想拿到state里边的数据需要在组建内通过vuex中结构的mapGetters方法到getters中读取state中的数据。

 

posted on 2019-03-28 15:57  心上有杨  阅读(156)  评论(0)    收藏  举报