前端面试题总结知识

2020-03-18  本文已影响0人  沈神奇

1解释下闭包

    闭包就是能够读取其他函数内部变量得函数。可以理解为定义在一个函数内部的函数。本质上闭包是将函数内部和函数外部连接起来的桥梁。

CSS左右定宽 中间自适应怎样呈现代码(左右div假设宽度为200px)

    1. 采用绝对定位。两个div都设置绝对定位,左边div的top和left为0,右边div的top和right为0,将中间div的margin-left和margin-right都设置为200px,可实现此布局。

    2.采用浮动定位。左边div设置float: left,右边div设置float: right,将中间div的margin-left和margin-right都设置为200px,可实现此布局。

前端三种缓存的区别 (LocalStorage,SessionStorage和cookie)

    localStorage有效期:永不失效,除非web应用主动删除。作用域是限定在文档源,文档源通过协议、主机名以及端口三者来确定。

    sessionStorage有效期:窗口关闭或者标签页关闭,存储的数据也就失效了。作用域也是限定在文档源,相同文档源的页面渲染在不同的标签中,sessionStorage的数据是无法共享的。(新建标签打开同一个页面时是无法使用同一个session的)。

    cookie默认的有效期非常短,存在于web浏览器会话期间,当浏览器关闭,cookie也就消失了。

   三种储存方式中,只有cookie是自动提交到后台的。 cookie最大4k,sessionstorage 和localstorage可以达到5m甚至是更大 。

    针对三种存储方式的不同可以应用于不同的场景,cookie多用于登陆状态保存,sessionstorage和localstorage多用于统计访问次数等特定数据的统计和存储

vue的路由和路由钩子函数

    vue-router是Vue.js官方的路由插件。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。

    第一种:全局钩子函数。   

    router.beforeEach((to, from, next) => { // 举例: 路由跳转前的操作

    console.log('beforeEach')

    //next() //如果要跳转的话,一定要写上next()

    //next(false) //取消了导航

    next() //正常跳转,不写的话,不会跳转

  })

  router.afterEach((to, from) => { // 举例: 通过跳转后改变document.title

    if( to.meta.title ){

      window.document.title = to.meta.title //每个路由下title

    }else{

      window.document.title = '默认的title'

    }

  })

    第二种:针对单个路由钩子函数

    beforeEnter(to, from, next){

    console.log('beforeEnter')

    next() //正常跳转,不写的话,不会跳转

  }

    第三种:组件级钩子函数

    beforeRouteEnter(to, from, next){ // 这个路由钩子函数比生命周期beforeCreate函数先执行,所以this实例还没有创建出来

    console.log("beforeRouteEnter")

    console.log(this) //这时this还是undefinde,因为这个时候this实例还没有创建出来

    next((vm) => { //vm,可以这个vm这个参数来获取this实例,接着就可以做修改了

      vm.text = '改变了'

    })

  },

  beforeRouteUpdate(to, from, next){//可以解决二级导航时,页面只渲染一次的问题,也就是导航是否更新了,是否需要更新

    console.log('beforeRouteUpdate')

    next();

  },

  beforeRouteLeave(to, from, next){// 当离开组件时,是否允许离开

    next()

  }

vue的生命周期

    Vue 实例从创建到销毁的过程,就是生命周期。从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、销毁等一系列过程,称之为 Vue 的生命周期。

    beforeCreate(创建前) created(创建后)完成数据观测,属性和方法的运算,初始化事件。

    beforeMount(载入前) mounted(载入后) 在el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用。

    beforeUpdate(更新前)updated(更新后) 在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。

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

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

vue的父子组件传值

    1.父组件与子组件传值

    父组件传给子组件:子组件通过props方法接受数据;

    子组件传给父组件:$emit方法传递参数

    2.非父子组件间的数据传递,兄弟组件传值

    eventBus,就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。项目比较小时,用这个比较合适。(虽然也有不少人推   荐直接用VUEX,具体来说看需求咯。技术只是手段,目的达到才是王道。)

vue的vuex如何使用

    只用来读取的状态集中放在store中; 改变状态的方式是提交mutations,这是个同步的事物; 异步逻辑应该封装在action中。

    在main.js引入store,注入。新建了一个目录store,….. export 。

vue中对keep-alive 的了解

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

    在vue 2.1.0 版本之后,keep-alive新加入了两个属性: include(包含的组件缓存) 与 exclude(排除的组件不缓存,优先级大于include) 。

vue的axios如何实现拦截

    axios.interceptors.request.use() // 开始进行拦截请求。

    axios.interceptors.response.use()//拦截请求响应数据。

vue的axios的如何设置请求头

    在封装的get或post请求里增加headers:{}对象 去设置所需要的请求头信息。

vue中 this.$nextTick()

    this.$nextTick()将回调延迟到下次 DOM 更新循环之后执行.。回调的 this 自动绑定到调用它的实例上。

vue中 key 值的作用

    key的作用主要是为了高效的更新虚拟DOM。

vue中 v-on 可以绑定多个方法吗

    可以

vue.js的两个核心是什么

    数据驱动、组件系统

vue中v-if 和 v-show 区别

    v-if按照条件是否渲染,v-show是display的block或none。

vue中route和router的区别

    route是路由信息对象,包括path,params,hash,query,fullpath,name,matched等路由信息参数。

    而router是“路由实例”对象包括了路由的跳转方法,钩子函数等。

vue几种常用的指令

    v-for 、 v-if 、v-bind、v-on、v-show、v-else

vue常用的修饰符

    .prevent: 提交事件不再重载页面;.stop: 阻止单击事件冒泡;.self: 当事件发生在该元素本身而不是子元素的时候会触发;.

    capture: 事件侦听,事件发生的时候会调用

原生JS中的事件委托

    事件委托:给父元素绑定事件,用来监听子元素的冒泡事件。也就是事件目标(子元素)不处理事件,把事件委托给父元素去处理。

 原生js中的事件冒泡,如何阻止事件冒泡

    事件冒泡:同一个事件从最里层冒泡到最外层。

    阻止冒泡事件: e.stopPropagation()。 不阻止默认行为,但阻止事件冒泡 。

    默认事件: a标签的跳转事件就是默认事件。

    阻止默认事件: e.preventDefault(); 不阻止事件冒泡,但阻止默认行为。

什么是跨域,跨域如何解决

    浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。

    解决跨域: 1. 前端本地proxy跨域代理。2. nginx代理。3.jsonp跨域。4.后端修改设置请求头header

前端的兼容性你做了哪些

    1.const问题。说明:Firefox下,可以使用const关键字或var关键字来定义常量; IE下,只能使用var关键字来定义常量. 

    解决方法:统一使用var关键字来定义常量

    2.集合类对象问题。问题说明:IE下,可以使用 () 或 [] 获取集合类对象;Firefox下,只能使用 [ ]获取集合类对象。

    解决方法:统一使用 [] 获取集合类对象

    3.为什么web标准中IE无法设置滚动条颜色了

     解决办法是将body换成html。(更多兼容性问题可百度了解)

前端的插件你用过哪些(目前项目vue,所以只举例vue的插件)

   1.element-ui 饿了么出品的Vue2的web UI工具套件

    2.mint-ui  Vue 2的移动UI工具套件

    3.vue-swiper 易于使用的轮播滑块组件

    4.vue-quill 适用于Vue2的富文本编辑器

    5.vue-charts 轻松渲染一个图表

移动端适配, rem,px,em的区别

    px:表示的是绝对的像素值,1px就是1像素大小

    em:关于em,网上有资料说是关于父元素的,但是其实个人感觉这种说法是不对的,其实em的大小是根据自身的font-size确定的,而只是正常的情况下子元素继承了父元素的font-size

    rem:是指根元素的大小,比如跟元素大小是16px(浏览器默认font-size),那么1rem的大小就是16px

CSS3 新特性有哪些

    CSS3实现圆角 (border-radius: 8px)

    阴影 (box-shadow: 10px)

    对文字加特效 (text-shadow)

    线性渐变(gradient)

    旋转(transform):rotate(9deg)

    缩放 (transform):scale(0.85,0.90)

    倾斜(transform):skew(-9deg,0deg)

    过渡效果(transition)

    动画效果(animation)

css预处理器常用的有哪些

    1.SASS     2.LESS      3. stylus

如何让一个div在一个div中垂直水平居中

    1.常用方法

    ①首先是利用定位:子绝父相

    ②然后将子盒子的left和top均设置为50%,因为定位的原点是在左上角,所有现在的位置是偏右下的

    ③利用transform的translate()方法移动子盒子宽和高的一半,这样子盒子就到中间来了 或者 margin-left和margin-top盒子宽和高的一半。

    2.利用margin:auto;子元素绝对定位,四个参数均为0

    3.利用display:flex; 内容居中justify-content:center;两端居中align-items:center。

es6用过哪些

    1.申明变量let和const

    let和const申明变量,const是申明常亮(申明后值不可修改,修改会报错),let是变量,都是块级作用域,在{}内有效

    2.箭头函数 

    箭头函数的this是定义时的this,不是运行时的,比如在vue中method找this.data的时候找不到,原因是this指向的不是运行时vue的实例,而是定义时的windos

    3.字符串模板 ``

    4.Promise 

    最大的好处就是可以链式的调用函数,起到异步回调函数的作用. es7还推出了更加简洁的写法Async/await

    5.展开运算符 [...,123,]

    6.import导入模块、export导出模块

数组去重(包含es6)

    1.利用下标查询

    2.es6的Set与Array.from()

    set是一种新的数据结构,它可以接收一个数组或者是类数组对象,自动去重其中的重复项目,set返回的是一个对象。

    Array.from()的作用,可以把伪类数组对象,可迭代对象转化为数组。

    3.利用对象的属性去重

        思路:每次取出原数组的元素,然后在对象中访问这个属性,如果存在就说明重复

JS的数据类型有哪些

     Undefined、Null、Boolean、Number和String,Object,symbol 表示独一无二的值、bigInt 表示任意大的整数

解释原型链

    JavaScript 对象(除了 null)在创建的时候就会关联一个对象,这个对象就是原型,每一个对象都会从原型上继承属性,

    原型也是对象,所以原型也有原型对象,层层往上,直到 Object.prototype,这就是原型链。

    对象都会有一个 __proto__ 属性来访问自己的原型,同时这个原型就是生成该对象的构造函数的 prototype 属性值。

    每个原型对象都有一个 constructor 属性,指向相关联的构造函数。

this指向,如何改变this指向

this就是函数运行时自动生成的一个内部对象。 this的指向不是在创建时就决定了,而是由执行环境决定的

    全局环境下,this就代表window对象。

    对象环境下,this指向对象。

    事件对象,在 DOM 事件中使用 this,this 指向了触发事件的 DOM 元素本身

    总结下来就是一句话:是谁调用的,this就指向谁

    1.可以使用局部变量来代替this指针

常用方法

    2.使用call 或 apply 方法

        apply和call的作用一样,不同的是传参的形式。 第一个参数都是要更改this指向的对象。后面的参数不同,apply需要以数组的形式传递参数,call是直接字符串参数传递。

git的使用

    1.git clone url 先把远程的项目clone下来

    2.git add * 把它们添加到缓存区

    3.git commit -m '增加备注' 代码提交信息

    4.git push origin master 可以把 master 换成你想要推送的任何分支。

    5.git pull 同步远程仓库代码

    还有其他命令 git checkout 切换分支, git status 查看文件状态, git branch -d 删除某个分支 git log 查看日志等

前端页面有哪三层构成,作用是什么

    HTML:结构层 、CSS:样式层 、JavaScript:行为层

H5语义化标签有哪些

    Nav, header,footer,Article,Aside,Mark,Section,Video,Datalist 强烈推荐,在我看来就是模糊查询,除了样式之外,非常好用

    Canvas,Main主要内容,等等(可以自主去了解)

给你一串字符串 或者一组数组,如何找到重复的 次数(思路是什么)

    声明一个变量=0,声明一个空数组,循环判断这组数据,如果空数组中没有这个数据,将这个数据push进去,同时将变量+=1。以此类推。就能得到重复数据的次数。监测数组中是否存在这个元素的属性是includes()。(个人看法)

http状态码

    200 OK:请求已正常处理。

    400("Bad Request") 客户端方面的问题

    500("Internal Server Error") 服务器方面的问题

    301("Moved Permanently") 当客户端触发的动作引起了资源URI的变化时发送此响应代码

    404("Not Found") 和410("Gone") 当客户端所请求的URI不对应于任何资源时,发送此响应代码

    409("Conflict") 当客户端试图执行一个”会导致一个或多个资源处于不一致状态“的操作时,发送此响应代码

状态码系列

    1XX:通知

     2XX: 成功

     3XX:重定向

     4XX:客户端错误 

     5XX:服务端错误

前端的性能的优化

    1.将图片用base64处理

    2.使用字体图标来代替图片

    3.雪碧图

    4.css,html,js以及图片压缩等

    5.减少请求数量

    6.优化资源加载

        1、CSS文件放在head中,先外链,后本页

  2、JS文件放在body底部,先外链,后本页

  3、处理页面、处理页面布局的JS文件放在head中,如babel-polyfill.js文件

  4、body中间尽量不写style标签和script标签

    7.webpack优化 等等 

告辞!总结到此结束!
上一篇下一篇

猜你喜欢

热点阅读