一、CSS

1.css过渡和动画有什么不一样

Animation和transition大部分属性是相同的,他们都是随时间改变元素的属性值,它们的主要区别是transition需要触发一个事件才能改变属性,而animation不需要触发任何事件的情况下才会随时间改变属性,并且transition为2帧,从from……to,而animation可以一帧一帧的。

2.清除浮动

  1. 使用带clear属性的空元素

    在浮动元素后使用一个空元素如

    ,并在CSS中赋予.clear{clear:both}属性即可清除浮动。亦可使用<br class="clear"/>或<hr class="clear">来进行清除

  2. 使用CSS的overflow属性

    给浮动元素的容器添加overflow:hiddenoverflow:auto,可以清除浮动;在添加overflow属性后,浮动元素又回到了容器层,把容器高度撑起,达到了清理浮动的效果

  3. 给浮动的元素的容器添加浮动

    给浮动元素的容器也添加上浮动属性即可,但是这样会使其整体浮动,影响布局,不推荐使用

  4. 使用邻接元素处理

    什么都不做,给浮动元素后面的元素添加clear属性

  5. 使用CSS的:after伪元素

    结合:after伪元素和IEhack,可以完美兼容当前主流的各大浏览器(IEhack指的是触发hasLayout)。

    给浮动元素的容器添加一个clearfix的class,然后给这个class添加一个:after伪元素来实现元素末尾添加一个看不见的块元素清除浮动

3.怎么实现适应性布局?

二、JavaScript

1.js原型和原型链

在js中使用构造函数来新建一个对象的,每一个构造函数的内部都有一个prototype属性值,这个属性值是一个对象,这个对象包含了可以由该构造函数的所有实例共享的属性和方法。当我们使用构造函数新建一个对象后,这个对象内部会包含一个指向该构造函数的的prototype属性对应的值的指针,一般来说是不能够获取这个值的,但是可以使用__proto__属性来访问这个属性,也可以使用Object.getPeototype()方法来获取对象的原型。

原型链:当访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,这就是原型链。原型链的尽头一般来说都是Object.prototype

2.js作用域和作用域链

在JavaScript中,作用域就是可访问变量,对象,函数的集合。JavaScript函数作用域:作用域在函数内修改。

自由变量:当前作用域没有定义的变量叫做自由变量。

作用域链可以理解为:当需要查找一个变量时,如果当前作用域没有找到,就到父级里找,如果父级也没有找到,就再往上找,这样一层一层向上寻找,这种一层一层的关系,就是作用域链

3.怎么处理跨域问题。

首先了解同源策略:域名,协议,端口相同的URL之间通信是同源;有一个不符合同源要求的话会出现跨域问题。

  • jsonp:使用jsonp来实现跨域请求,它的主要原理是通过动态创建script标签来实现跨域请求,因为浏览器对script的引入没有跨域的访问限制。通过在请求的url后指定一个回调函数,然后服务器在返回数据的时候,构建一个json数据的包装,这个包装就是回调函数,然后返回给前端,前端接收到数据后,因为请求的是脚本文件,所以会直接执行,先前定义好的回调函数就可以被调用,从而实现跨域请求的处理。但是这种方式只能通过get请求
  • document.domain:将document.domain设置为主域名,来实现相同子域名的跨域操作,这个时候主域名下的cookie就能被子域名说访问。(相同主域名不同子域名的情况下)
  • location.hash:可以在主页面动态的修改iframe窗口的hash值,然后在iframe窗口里实现监听函数来实现一个单向的通信。因为在iframe是没有办法访问到不同源的父级窗口,所以不能直接修改父级窗口的hash值来实现通信,可以在iframe中再加入一个iframe,这个iframe的内容是和父级页面同源的,所以可以用window.parent.parent来修改最顶级页面的src,以此来实现双向通行。
  • CORS:CORS是一个W3C标准,全称是“跨域资源共享”。CORS需要浏览器和服务器同时支持。CORS请求分成两类:简单请求和非简单请求。
    • 简单请求:浏览器直接发出CORS请求,就是会在头信息中,增加一个Origin字段。Origin字段用来说明本次请求来自哪个源。服务器根据这个值,决定是否同意本次请求。
    • 非简单请求:浏览器会先发出一次预检请求,来判断该域名是否在服务器的白名单中,如果收到肯定回复后才会发起请求。

4.生命周期

1.JavaScript变量的生命周期

JavaScript变量生命周期在它声明时初始化,局部变量在函数执行完毕后销毁,全局变量在页面关闭后销毁

5.date-fns轻量级日期库

6.document.write和innerHTML的区别?

document.write的内容会代替整个文档内容,会重写整个页面

innerHTML的内容只是替代指定元素的内容,只会重写页面中的部分内容。

三、Vue

1.vue路由的实现方式

2.MVVM和MVC

区别:1.mvvm各部分的通信是双向的,而mvc各部分的通信是单向的;2.mvvm是真正将页面与数据逻辑分离放到js里去实现的,而mvc里面未分离。

1.MVC

MVC包括view视图层,controller控制层,model数据层。各部分之间的通信都是单向的。

View传送指令到controller,controller完成业务逻辑后,要求model改变状态,model将新的数据发送到view,用户得到反馈。

2.MVVM

MVVM包括view视图层,model数据层,viewmodel层。各部分通信都是双向的。采用双向数据绑定,view的变动,自动反映在viewmodel,反之亦然。其中viewmodel层,就是view和model层的粘合剂,它是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他各种各样的代码的极好的地方。也就是说,就是把原来viewcontroller层的业务逻辑和页面逻辑等剥离出来放到viewmodel层。

3.moment日期处理库

获取时间:monent().format('YYYY-MM-DD')

获取年月日时分秒:monent().year();moment().month()以此类推

4.vue的生命周期

beforeCreatenew Vue()之后触发的第一个钩子,在当前阶段data,methods,computed以及watch上的数据和方法都不能被访问

created实例创建后发生,当前阶段已经完成了数据观测,也就是可以使用数据更改数据,在这里更改数据不会触发updated函数。可以做一些初始数据的获取,在当前阶段无法与DOM进行交互,如果要交互,可以通过vm.$nextTick来访问DOM

beforeMount发生在挂载之前,在这之前template模版已导入渲染函数编译。而当前阶段虚拟DOM已经创建完成,即将开始渲染。在此时也可以对数据进行更改,不会触发updated。

mounted挂载完成后发生,在当前阶段,真实的DOM挂载完毕,数据完成双向绑定,可以访问到DOM节点,使用$refs属性对DOM进行操作。

beforeUpdate发生在更新前,也就是响应式数据发生更新,虚拟dom重新渲染之前被触发,可以在当前阶段进行更改数据,不会造成重渲染。

updated发生在更新完成之后,当前阶段组件DOM已完成更新。要注意的是避免在此期间更改数据,因为这可能会导致无限循环的更新

beforeDestroy发生在实例销毁之前,在之前阶段实例完全可以被使用,可以在这时进行善后收尾工作,比如清楚计时器

destroyed发生在实例销毁之后,这个时候只剩下dom空壳,组件已被拆解,数据绑定被卸除,监听被移出,子实例被统统销毁。

5.说一下computed和watch

computed本质是一个具备缓存的watcher,依赖的属性发生变化就会更新视图。适用于计算比较消耗性能的计算场景。当表达式过于复杂时,在模版中放入过多逻辑会让模版难以维护,可以将复杂的逻辑放入计算属性中处理。

watch没有缓存性,更多的是观察的作用,可以监听某些数据执行回调。当我们需要深入监听对象中的属性时,可以打开deep:true选项,这样会对对象中的每一项进行监听。这样会带来性能问题,优化的话可以使用字符串形式监听,如果没有写到组件中,要使用unWatch手动注销

6.v-if和v-show的区别

但条件不成立时,v-if是不会渲染DOM元素,v-show操作的时样式display,切换当前DOM的现实和隐藏。

7.v-model的原理

v-model本质上是一个语法糖,可以看成value+input方法的语法糖。可以通过model属性的propevent属性来进行自定义。原生的v-model,会根据标签不同生成不同的事件和属性。

8.vue事件绑定的原理

原生事件绑定是通过addEventListener绑定给真实元素的,组件事件绑定是通过Vue自定义的$on来实现的。

四、计算机网络

1.http和https的区别

五、算法

1.冒泡算法

2.快速排序的思想和实现代码

六、jQuery篇

1.jQuery源码看过吗,简单概括一下它的实现原理?

jQuery源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,然后通过传入window对象参数,可以使window对象作为局部变量使用,好处是当jQuery中访问window对象的时候,就不用将作用域链退回到顶层作用域了,从而可以更快的访问window对象。同样,传入undefined参数,可以缩短查找undefined时的作用域链。

2.jQuery.fn的init方法返回的this指的是什么对象?为什么要返回this?

返回的this指的是当前操作后的jquery对象,为了实现jquery的链式操作。

3.jquery中如何将数组转化为json字符串,然后再转化回来?

使用jquery全局方法$.parse.JSON这个方法

4.jQuery的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?

jQuery的$.extend浅拷贝,拷贝对象A时,对象B将拷贝A的所有字段,如果字段是内存地址,B将拷贝地址,若字段是基元类型,B将复制其值。缺点是如果改变了对象B所指向的内存地址,同时也改变了对象A指向这个地址的字段。

jQuery的$.extend深拷贝,这种方式会完全拷贝所有数据,优点是B与A不会相互依赖,缺点是拷贝的速度更慢,代价更大。

5.jQuery一个对象可以同时绑定多个事件,这是如何实现的?

jquery中时间绑定的函数中传递多个事件参数,执行事件的时候判断执行事件的类型。

七、HTML

1.HTML5的新特性。