2021前端面试题

1:vue-router 是什么?

答:vue-router 是 vue 的路由插件

2:怎么定义 vue-router 的动态路由? 怎么获取传过来的值?

答:在第一个页面调用 this. r o u t e r . p u s h ( p a r a m s ) 里 面 传 参 第 二 个 页 面 通 过 t h i s . router.push({params})里面传参 第二个页面通过this. router.push(params)this.route.params获取参数

3:vue-router 有哪几种导航钩子?

1.导航钩子的作用:vue-router 的导航钩子,主要用来作用是拦截导航,让他完成跳转或取消。

2:植入路由导航的方式:全局的,单个路由独享的,组件级的

全局导航钩子主要有两种钩子:前置守卫、后置钩子,

to 、from 、next 分别的作用:

1:to: 代表要进入的目标,它是一个路由对象,

 2:from: 代表当前正要离开的路由,同样也是一个路由对象

 3:next:这是一个必须需要调用的方法,而具体的执行效果则依赖 next 方法调用的参数

全局钩子后置钩子:不同于前置守卫,后置钩子并没有 next 函数,也不会改变导航本身

4 :组建内的导航钩子:

 组件内的导航钩子主要有这三种:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave。

 他们是直接在路由组件内部直接进行定义的

5:$route 和 $router 的区别?

1
router为VueRouter的实例,相当于一个全局的路由器对象,里面含有很多属性和子对象,

 route相当于当前正在跳转的路由对象。

6:vue-router响应路由参数的变化?

使用watch (监测变化)

7:vue生命周期函数:

beforeCreate(创建实例)

created(创建完成)、

beforeMount(开始创建模板)

mounted(创建完成)、

beforeUpdate(开始更新)

updated(更新完成)、

beforeDestroy(开始销毁)

destroyed(销毁完成)

ajax操作是在mounted生命周期中完成的。

8:axios和ajax的区别:

1.区别 axios是通过promise实现对ajax技术的一种封装,就像jQuery实现ajax封装一样。

简单来说: ajax技术实现了网页的局部数据刷新,axios实现了对ajax的封装。 axios是ajax ajax不止axios。

9:vue中解决跨域问题?

方法1.后台更改header

方法2.使用JQuery提供的jsonp

方法3.使用http-proxy-middleware 代理解决(项目使用vue-cli脚手架搭建)

10:vue路由钩子函数:

路由的钩子函数总结有6个

全局的路由钩子函数:beforeEach、afterEach

单个的路由钩子函数:beforeEnter

组件内的路由钩子函数:beforeRouteEnter、beforeRouteLeave、beforeRouteUpdate

11:vue父子组件之间的传值:

 子组件通过props方法接受父组件传来的值,子组件通过$emit方法来向父组件发送数据。

12. 谈谈你对MVVM开发模式的理解

答:MVVM分为Model、View、ViewModel三者。

Model 代表数据模型,数据和业务逻辑都在Model层中定义;

View 代表UI视图,负责数据的展示;

ViewModel 负责监听 Model 中数据的改变并且控制视图的更新,处理用户交互操作;

Model 和 View 并无直接关联,而是通过 ViewModel 来进行联系的,Model 和 ViewModel 之间有着双向数据绑定的联系。因此当 Model 中 的数据改变时会触发 View 层的刷新,View 中由于用户交互操作而改变的数据也会在 Model 中同步。

这种模式实现了 Model 和 View 的数据自动同步,因此开发者只需要专注对数据的维护操作即可,而不需要自己操作 dom。

13:vue的优点?

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

14. $nextTick的使用

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

15:谈谈你对vue的认识

vue概念:是一个构建用户界面的渐进式框架,典型的MVVM框架。

注:模型(Model)只是普通的JavaScript对象,修改它则视图(View)会自动更新。这种设计让状态管理变得非常简单而直观。

vue作用:响应式的数据绑定和组合的视图组件

vue原理:数据双向绑定     模板编译和虚拟dom

1:vue2.x 的双向绑定原理,不支持ie8的原因?

原理:

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

 不支持ie8的原因:
当你把一个普通得到javaScript对象传给vue实例的data选项,vue将遍历此对象所有的属性,并使用object.defineProperty把这些属性
全部转为getter/setter。Object.defineProperty是ES5中一个无法shim的特性,这也就是为什么Vue不支持IE8以及更低版本浏览器的原因。
何为shim特性:
指把一个库引入到另一个旧的浏览器,然后用旧的api,实现一些新的api功能。

2:如何让css样式只在当前组件起作用?

当前组件

3:标签的作用?

keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。

4:v-show和和v-if的区别?

v-if元素隐藏时,会在dom节点中把该元素移除
v-show元素隐藏时,会在dom节点中把该元素设置css属性为display : none,元素依然保留在dom节点中

v-show:
1、v-show仅仅控制元素的显示方式,通过display属性的none
2、当我们需要经常切换某个元素的显示/隐藏时,使用v-show会更加节省性能上的开销

v-if:
1、v-if会控制这个DOM节点的存在与否,
2、如果在运行时条件很少改变,则使用 v-if 较好。

5:vue中常用的3个生命周期钩子函数?

created: 实例已经创建完成之后调用,在这一步,实例已经完成数据观测, 属性和方法的运算, watch/event事件回调. 
然而, 挂载阶段还没有开始,      $el属性目前还不可见

mounted: el被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,
当 mounted被调用时 vm.$el 也在文档内。

activated: keep-alive组件激活时调用

6:组件之间的传值?

 子组件通过props方法接受父组件传来的值,子组件通过$emit方法来向父组件发送数据。

7:computer和watch的作用和区别?

 计算属性computed : 
 1. 支持缓存,只有依赖数据发生改变,才会重新进行计算
 2. 不支持异步,当computed内有异步操作时无效,无法监听数据的变化
 3.computed 属性值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data中声明过的数据通过计算得到的
 4. 如果一个属性是由其他属性计算而来的,这个属性依赖其他属性,是一个多对一或者一对一,一般用computed
 5.如果computed属性属性值是函数,那么默认会走get方法;函数的返回值就是属性的属性值;在computed中的,属性都有一个get和一个         set方法,当数据变化时,调用set方法。

 侦听属性watch:
 1. 不支持缓存,数据变,直接会触发相应的操作;
 2.watch支持异步;
 3.监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值;
 4. 当一个属性发生变化时,需要执行对应的操作;一对多;

8:组件的引用流程?

1:在当前组件的script中引入调用组件:import 组件名字(自己随便起的)from‘组件的相对路径’,
2: 接着注册组件:在export default中创建属性components:{组件的标签名(自己起的):组件的名字},
3:最后使用组件:在template中需要使用组件的地方以标签的形式使用组件<组件的标签名></组件的标签名>

9;什么是响应式设计?响应式设计的基本原理是什么?如何兼容较低版本的IE?

答:一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。

    优点:

        面对不同分辨率设备灵活性强

        能够快捷解决多设备显示适应问题

    缺点:

        兼容各种设备工作量大,效率低下

        代码累赘,会出现隐藏无用的元素,加载时间加长

        其实这是一种折中性质的设计解决方案,多方面因素影响而达不到最佳效果

        一定程度上改变了网站原有的布局结构,会出现用户混淆的情况

         respond.js和css3-mediaqueries-js

10:设置元素浮动后,该元素的display值是多少?

   display:block

1.wx.setStorage(wx.setStorageSync)、wx.getStorage(wx.getStorageSync)、wx.clearStorage(wx.clearStorageSync)

可以对本地缓存进行设置、获取和清理。本地缓存最大为10MB

2:sessionStorage(html5)将数据保存在session对象中

2.localStorage(html5) 是永久存储,需要手动去清除

这两者的区别在于,sessionStorage为临时保存,而localStorage为永久保存。

3:cookie保存在浏览器端,cookie的大小被限制在4KB,安全性较低

session保存在服务器端,Session保存的东西越多,就越占用服务器内存,安全性较高

28.Doctype作用

:声明文档类型

什么是ajax:

AJAX是“Asynchronous JavaScript and XML”的缩写。

他是指一种创建交互式网页应用的网页开发技术。

Ajax应用程序的优势在于:

  1. 通过异步模式,提升了用户体验
  2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
  3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。

2、AJAX最大的特点是什么。

Ajax可以实现动态不刷新(局部刷新)
就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,
并避免了在网络上发送那些没有改变过的信息。

2.Ajax如何使用

一个完整的AJAX请求包括五个步骤:

1.创建XMLHTTPRequest对象
2. 使用open方法创建http请求,并设置请求地址
xhr.open(get/post,url,async,true(异步),false(同步))经常使用前三个参数
3.设置发送的数据,用send发送请求
4. 注册事件(给ajax设置事件)
5.获取响应并更新页面

2。什么是异步

同步(sync)是一件事一件事的执行,只有前一个任务执行完毕才能执行后一个任务。
异步(async)相对于同步,程序无须按照代码顺序自上而下的执行。

3.为什么要使用异步
由于js是单线程的,只能在js引擎的主线程上运行,所以js代码只能一行一行的执行,
如果没有异步的存在,由于当前的任务还没有完成,其他的所有操作都会无响应,用户就会长时间的在等待。

4.常见的异步模式有六种:

回调函数
事件监听
发布/订阅模式
promise
Generator(ES6)
async/await(ES7)

如何解决跨域问题?

  1. jsonp
    jsonp能实现跨域是利用了img、script和link标签自身的跨域能力。
    我们知道当img或者script中的src是一个链接的时候,浏览器会请求这个链接获取资源,
    那么这个链接如果是跨域的,浏览器也会请求,从而达到了跨域请求的一个功能。

2.通过设置Access-Control-Allow-Origin来实现跨域

3、response 添加 header

数组去重的方式:

1、使用indexof()方法
2、使用includes方法
3、利用for嵌套for,然后splice去重
4、利用ES6 Set去重
5、利用sort()
6、利用includes
7、利用递归去重
8、利用Map数据结构去重
9、利用reduce+includes

HTTP协议和HTTPS区别

http是超文本传输协议,信息是明文传输,https是具有安全性的ssl解密传输协议
http和https连接方式完全不同,端口也不同,http是80,https是443
http的连接很简单,是无状态的
https协议是由ssl+http协议构建的可进行加密传输,身份认证的网络协议,比http协议安全

什么是js内存泄露?

内存泄漏是指一块被分配的内存既不能使用又不能回收,直到浏览器进程结束

释放内存的方法:赋值为null

css选择器有哪些?
id选择器,标签选择器,class选择器,类选择器,子选择器,包含选择器

1.Vue的核心是什么

Vue是一套构建用户界面的渐进式自底向上增量开发的MVVM框架,vue的核心只关注视图层,

2.v-text与{{}}与v-html区别

{{}} 将数据解析为纯文本,不能显示输出html

v-html 可以渲染输出html

v-text 将数据解析为纯文本,不能输出真正的html,与花括号的区别是在页面加载时不显示双花括号

6.v-on可以绑定多个方法吗

可以 如果绑定多个事件,可以用键值对的形式 事件类型:事件名

     如果绑定是多个相同事件,直接用逗号分隔就行

19.Vue数据绑定的几种方式

1.单向绑定 双大括号 {{}} html内字符串绑定

2.v-bind绑定 html属性绑定

3.双向绑定 v-model

4.一次性绑定 v-once 依赖于v-model

25.Vue中指令有哪些

v-for:循环数组,对象,字符串,数字

v-on:绑定事件监听

v-bind:动态绑定一个或者多个属性

v-model:表单控件或者组件上创建双向绑定

v-if v-else v-else-if 条件渲染

v-show 根据表达式真假,切换元素的display

v-html 更新元素的innerhtml

v-text 更新元素的textcontent

v-pre 跳过这个元素和子元素的编译过程

v-clock 这个指令保持在元素上知道关联实例结束编译

v-once 只渲染一次
30.Mvvm与mvc的区别

Mvc模型视图控制器,视图是可以直接访问模型,所以,视图里面会包含模型信息,mvc关注的是模型不变,
所以,在mvc中,模型不依赖视图,但是视图依赖模型

Mvvm 模型 视图 和vm vm是作为模型和视图的桥梁,当模型层数据改变,
vm会检测到并通知视图层进行相应的修改

32.Vue双向绑定的原理

Vue双向绑定就是:数据变化更新视图,视图变化更新数据

Vue数据双向绑定是通过数据劫持和观察者模式来实现的,

数据劫持,object.defineproperty它的目的是:当给属性赋值的时候,程序可以感知到,就可以控制改变属性值

观察者模式 当属性发生改变的时候,使用该数据的地方也发生改变

Web前端性能优化

1、减少http请求,合理浏览器缓存
2、启用压缩:HTML、CSS、javascript文件启用GZip压缩可达到较好的效果
3、CSS Sprites:合并 CSS图片,减少请求数的又一个好办法。
4、LazyLoad Images:在页面刚加载的时候可以只加载第一屏,当用户继续往后滚屏的时候才加载后续的图片
5、CSS放在页面最上部,javascript放在页面最下面:让浏览器尽快下载CSS渲染页面
6、异步请求Callback(就是将一些行为样式提取出来,慢慢的加载信息的内容)

前端性能优化:

  1. CSS优化:

CSS写在头部,JavaScript写在尾部或异步
避免图片和iFrame等的空src
尽量避免重置图片大小
图片尽量避免使用DataURL
尽量避免写在HTML标签中写style属性
避免CSS表达式
移除空的CSS规则
正确使用Display的属性
不滥用浮动Float
不滥用Web字体
不声明过多的Font-size
值为0时不需要任何单位
标准化各种浏览器前缀
避免让选择符看起来像正则表达式

  1. 图片优化
使用智图 http://zhitu.tencent.com/
使用(CSS3、SVG、IconFont)代替图片
使用Srcset
webP优于JPG
PNG8优于GIF
图片不宽于640
  1. 脚本优化

    减少重绘和回流
    缓存Dom选择与计算
    尽量使用事件处理,避免批量绑定事件
    尽量使用ID选择器
    使用touchstart、touchend代替click

  2. 渲染优化

    HTML使用Viewpoint
    减少Dom节点
    尽量使用CSS3动画
    合理使用requestAnimationFrame动画代替setTimeout
    适当使用Canvas动画
    Touchmove、Scroll事件会导致多次渲染
    使用(CSS3 transitions、CSS3 3D transform、Opacity、Canvas、WebGL Video)来触发GPU渲染

5 .onshow和onLoad的区别?

onshow在每次打开页面都会加载数据,可以用于数据在需要刷新的环境下

onload只是在第一次进入页面会刷新数据,从二级页面回来不会重新加载数据

6:单页面的优缺点?

单页面:是指只有一个主页面的应用,浏览器一开始就要加载所有必须的html,js,css,

优点:
1:用户体验好,快,内容改变不需要重新加载整个页面;
2:没有页面之间的切换,就不会出现白屏现象

缺点:
1:首次加载耗时比较多,
2:不利于SEO
3:不可以用导航实现前进后退效果,
4:页面复杂度高

7:Jquery和vue的区别?

1:jquery首先要获取到dom对象,然后对dom对象进行值的修改操作,

2:vue是首先把值和js对象进行绑定,然后修改js对象的值,vue框架就会自动把dom值更新,

3:这种dom元素跟随js对象值的变化而变化叫做单项数据绑定,
如果js对象的值也跟随这dom元素的值变化而变化叫做双向数据绑定

7.var、let、const之间的区别

var声明变量可以重复声明,而let不可以重复声明
var是不受限于块级的,而let是受限于块级
var会与window相映射(会挂一个属性),而let不与window相映射
var可以在声明的上面访问变量,而let有暂存死区,在声明的上面访问变量会报错
const声明之后必须赋值,否则会报错
const定义不可变的量,改变了就会报错
const和let一样不会与window相映射、支持块级作用域、在声明的上面访问变量会报错

3、使用箭头函数应注意什么?

(1)用了箭头函数,this就不是指向window,而是父级(指向是可变的)
(2)不能够使用arguments对象
(3)不能用作构造函数,这就是说不能够使用new命令,否则会抛出一个错误
(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数

5、介绍下 Set、Map的区别?

应用场景Set用于数据重组,Map用于数据储存Set: 
(1)成员不能重复
(2)只有键值没有键名,类似数组
(3)可以遍历,方法有add, delete,has
Map:
(1)本质上是健值对的集合,类似集合
(2)可以遍历,可以跟各种数据格式转换

7、Promise构造函数是同步执行还是异步执行,那么 then 方法呢?

  promise构造函数是同步执行的,then方法是异步执行的

9、promise有几种状态,什么时候会进入catch?

三个状态:
 pending、fulfilled、reject
两个过程:
padding -> fulfilled、padding -> rejected当pending为rejectd时,会进入catch

10、字符串转数组

split()方法

11、闭包的原理

闭包的原理就是利用作用域链的特性,首先在当前作用域访问数据,
当前作用域访问不到,则向父级访问,父级也没有,一直找到全局。

12、js原型的理解:

 原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript的对象中都包含了一个”[[Prototype]]”
 内部属性,这个属性所对应的就是该对象的原型。

原型链:当实例调用某一个属性时,先在本身找,如果没有找到,就到它的原型对象上逐级往上找(proto),

          直到找到Object.prototype,如果还找不到则原路返回(constructor),告诉它方法或属性未定义

总结: 原型链就是在访问一个对象属性的时候,如果自身没有找到的情况下会去它的原型对象中查找,
如果还没有,会去它的原型对象的原型对象中查找,如此循环直到顶层的Object对象的原型对象(是个null,Object.prototype.proto===null)为止的这么个机制

13、谈一下require和import的区别?

 1、写法上有差别,import可以使用import * 引入全部的export,
      也可以使用import aaa, { bbb}的方式分别引入default和非default的export,相比require更灵活。

14、require和import会不会循环引用?

不会,因为模块执行后会把导出的值缓存,下次再require或者import不会再次执行。这样也就不会循环引用了。

15、js里面的push和concat的区别?

push 遇到数组参数时,将整个数组参数作为一个元素插入;
concat 则是拆开数组参数,一个元素一个元素地加进去。  

16、js对象转化为jquery对象

  只需要用$()把DOM对象包起来,就能获取一个jquery对象

17、jquery对象转为js对象

1、jquery对象是一个数据对象,可通过[index]的方法,转为js对象

2、jquery本身提供,通过get(index)方法,转为js对象

18、布局有几种?

  1.table 布局
  2.flex 布局
  3.float布局
  4.响应式布局

19、vue混入?

混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式。
混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。
一:数据对象合并:data{ }
二:钩子函数合并:created() ,mounted
三:methods, components 和 directives合并
四:全局混入

20、Vuex有五个属性 state getters mutations actions modules

State就是数据源存放地,对应一般vue对象的data,state里面存放的数据是响应式的,state数据发生改变,对应这个数据的组件也会发生改变 用this.$store.state.xxx调用

Getters 相当于store的计算属性,主要是对state中数据的过滤,用this.$store.getters.xxx调用

Mutations 处理数据逻辑的方法全部放在mutations中,当触发事件想改变state数据的时候使用mutations,用this.$store.commit调用,给这个方法添加一个参数,就是mutation的载荷(payload)

Actions 异步操作数据,但是是通过mutation来操作 用this.$store.dispatch来触发,actions也支持载荷

使用场景:组件之间的状态,登录状态,加入购物车,音乐播放

21、watch 监听属性配置:

deep 是否深度
immeditate  是否立即执行

22、js数据检测

  1、typeof
  2、instanceof
  3、constructor
  4. Object.prototype.toString.call()
  5. jquery.type()

23、数组的常用方法

1、join ( 将数组的元素组起一个字符串)
2.toString() 把数组转换为一个字符串,并返回结果
3、forEach() —— 循环数组
4、shift() 删除原数组第一项,并返回删除元素的值
5、pop() —— 删除原数组最后一项,并返回删除元素的值
6、push() —— 向数组的末尾添加一个或多个元素,并返回新的长度
7、concat() —— 连接两个或多个数组
8、sort(sortby) —— 按指定的参数对数组进行排序
9、includes() —— 检测数组中是否包含某个元素
10、find() —— 返回通过测试(函数内判断)的数组的第一个元素的值
11、 map()—— 返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值

24、组件通讯

1、父子通信:
父向子传递数据是通过 props,子向父是通过 events( e m i t ) ; 通 过 父 链 / 子 链 也 可 以 通 信 ( emit); 通过父链 / 子链也可以通信( emit/parent / c h i l d r e n ) ; r e f 也 可 以 访 问 组 件 实 例 ; p r o v i d e / i n j e c t A P I ; children); ref 也可以访问组件实例;provide / inject API; childrenref访provide/injectAPIattrs/ l i s t e n e r s 2 、 兄 弟 通 信 : e v e n t B u s ; V u e x 3 、 跨 级 通 信 : e v e n t B u s ; V u e x ; p r o v i d e / i n j e c t A P I 、 listeners 2、兄弟通信: eventBus;Vuex 3、跨级通信: eventBus;Vuex;provide / inject API、 listeners2eventBusVuex3eventBusVuexprovide/injectAPIattrs/$listeners

25、父子组件的生命周期顺序?

加载渲染过程: 父 beforeCreate =》 父created =》 子beforeCreate =》
子created =》 子mounted =》 父mounted
子组件更新渲染过程:父beforeUpdate->子beforeUpdate->子updated->父updated
父组件更新渲染过程:父beforeUpdate->父updated
销毁过程:父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

26、Vue中常见性能优化

 1、编码优化

不要将所有的数据都放到data中,data中的数据都会增加getter、setter,会收集对应的watcher
  vue在v-for时给每项元素绑定事件需要用事件代理
 SPA页面采用keep-alive缓存组件
 拆分组件(提高复用性、增加代码的可维护性,减少不必要的渲染)
 v-if当值为false时,内部指令不会执行,具有阻断功能。很多情况下使用v-if替换v-show
   key保证唯一性(默认vue会采用就地复用策略)
  Object.freeze冻结数据
    合理使用路由懒加载、异步组件
    数据持久化的问题,防抖、节流

2、Vue加载性能优化

第三方模块按需导入(babel-plugin-component)
滚动到可视区域动态加载(https://tangbc.github.io/vue-virtual-scroll-list)
图片懒加载(https://github.com/hilongjw/vue-lazyload.git)

3、用户体验

app-skeleton骨架屏
 app shell app壳
  pwa

4、SEO优化

预渲染插件prerender-spa-plugin
 服务端渲染ssr

5、打包优化

 使用cdn的方式加载第三方模块
 多线程打包happypack
 splitChunks抽离公共文件
 sourceMap生成

6、缓存压缩

 客户端缓存、服务端缓存
  服务端gzip压缩

7 v-for循环中key的作用?

key 的作用主要是 为了实现高效的更新虚拟 DOM,提高性能。
其原理是vue在patch的过程中通过key可以精准的判断两个节点是否是同一个,
从而避免频繁的更新元素,使得整个patch过程更加高效,减少DOM操作量,提高性能。

8、for in循环容易出现什么问题?

for in循环会把原型链中的属性和方法一起遍历出来

解决方法:使用 for of循环

9.link 和@import 的区别?

区别 1: link 是 XHTML 标签,除了加载 CSS 外,还可以定义 RSS 等其他事 务;
@import 属于 CSS范畴,只能加载 CSS 。
区别 2: link 引用 CSS 时,在页面载入时同时加载; @import 需要页面网页完全载入以后加载。
区别 3: link 是 XHTML 标签,无兼容问题; @import 是在 CSS2.1 提出的,低版本的浏览器不支持。
区别 4: link 支持使用 Javascript 控制 DOM 去改变样式;而 @import 不支 持。

10.JS 数据类型

基本类型:Number、String、Boolean、null、undefined、symbol(ES6 新增的),BigInt(ES2020)
引用类型:Object,对象子类型(Array,Function)

11.bind,apply,call三者的区别?

相同:都是改变this指向的方法

不同:apply:和call基本上一致,唯一区别在于传参方式,

     bind:语法和call一模一样,区别在于立即执行还是等待执行,bind不兼容IE6~8

例子:
function fun(a,b){
}
var obj = {
}
fun.apply(obj,[1,2]);//apply需要将实参以数组的形式传递
fun.call(obj,1,2);//call可以将实参以此传递

笔试题:

1: var x = 1,y=z=0;
function add(n){
n = n+1;
}
y = add(x);
function add(n){
n = n+3;
}
z = add(x);
执行以上代码完毕后 x,y,z的值分别是多少?
x = 1; 因为方法里面没有return n;所以y,z都是undefined;

2:实现js对象继承

function teacher(name){
this.name = name;
}
teacher.prototype.sayName = function(){
console.log("name is "+this.name);
}
var teacher1 = new teacher(“xiaoming”);
teacher1.sayName();
function student(name){
this.name = name;
}
student.prototype = new teacher()
var student1 = new student(“xiaolan”);
student1.sayName();

3、编写一个方法去掉一个数组的重复元素

/***
*

  • 编写一个方法,去掉数组的重复元素;
  • params:Array
  • 利用:ES6: 新的数据结构 new Set();
    类数组转换:Array.from();
    */

function noRepeatItemArray(array){
return Array.from(new Set(array));
}

/**
params:Array

  • 利用:arrayObj.indexOf(); 返回下标;
  • 不存在则返回-1;
    */
    function noRepeatItemArray2(array){
    let len=array.length,
    arrTemp=[];
    for(let i=0;i<len;i++){
    // 如果当前temp数组中不存在该item;则push;
    if(arrTemp.indexOf(array[i])<0){
    arrTemp.push(array[i]);
    }
    }
    return arrTemp;

}

/**

  • params:Array;

  • 利用:
    arrObj[i]=undefined;i notIn arrObj;
    !undefined===true;
    */
    function noRepeatItemArray3(array){
    let len=array.length,
    arrObj={},
    arrTemp=[];
    for(let i=0;i<len;i++){
    if(!arrObj[array[i]]){
    arrObj[array[i]]=1;
    arrTemp.push(array[i]);
    }
    }// end of for loop;

    return arrTemp;
    }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值