持续更新前端面试题复习

172 阅读6分钟

如何延长作用域?

默认情况下,js代码处在全局作用域(顶级作用域:0级),当我们声明一个函数的时候,就会开辟一个局部作用域(1级)。 如果在局部作用域中又声明函数,就会形成新的局部作用域(2级),以此类推,形成链式结构。称之为作用域链。

思考: 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问。

image.png

  • 作用域的延长
  1. try - catch 语句的 catch 块,包含的是被抛出的error对象

语法:

   try{
       throw Error("出错误了");
   }catch(e){
      alert(e);  //alert("Error: 出错误了")
   }
   console.log(e);  //undefind
})(window);

在执行catch语句块时,JavaScript自动把其执行环境添加作用域链中,但是该语句块执行完后又自动把该执行环境(变量对象)移除

  1. with 语句 返回的是location对象,可以使用其属性和方法,一般有性能问题,不推荐.

第一次加载页面会触发哪几个钩子函数

第一次页面加载时会触发 beforeCreate, created, beforeMount, mounted 这几个钩子函数

思考: 技术点 Vue 实例从创建到销毁的过程,也就是从开始创建、初始化数据、编译模板、挂载 Dom→渲染、更新→渲染、卸载等一系列过程,我们称这是 Vue 的生命周期。

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

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

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

mounted在挂载完成后发生,在当前阶段,真实的Dom挂载完毕,数据完成双向绑定,可以访问到Dom节点,使用$refs属性对Dom进行操作。一般可以在这个阶段进行Ajax请求,但需要注意的是服务端渲染时不支持mounted,需要放到created中。

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

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

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

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

image.png

#v-if与v-show的区别 v-show “条件隐藏”,类似于display,切换样式的显示隐藏 v-if “条件渲染”,类似于渲染DOM,切换当前DOM的显示隐藏

介绍下原型链

JavaScript是面向对象的,每一个实例对象都有自己的原型, 而原型也是对象,也有自己的原型。以此类推,形成链式结构,称之为原型链。

Vue中key值的作用是什么?

两种情况:

  1. v-if中使用key,key的作用是为标签添加一个唯一的标识key,来表示元素的唯一性. 如: 如果我们在模板中切换前后都存在input框,此时我们在input框中写入一些数据,并且进行页面切换,则原有的数据就会保存。

  2. v-for中使用key,对于用v-for渲染的列表数据来说,数据量可能一般很庞大,而且我们经常还要对这个数据进行一些增删改操作。那么整个列表都要重新进行渲染一遍,那样就会很费事。而key的出现就尽可能的回避这个问题,提高效率。v-for默认使用就地复用的策略,列表数据修改的时候,他会根据key值去判断某一个值是否修改,如果修改则重新渲染该项,否则复用之前的元素。在v-for中我们的key一般为id,也就是唯一的值,但是一般不要使用index作为key

Vue-Router有哪几种路由守卫

路由守卫又称导航守卫,指是路由跳转前、中、后过程中的一些钩子函数。官方解释是vue-router提供的导航守卫,要通过跳转或取消的方式来守卫导航。路由守卫分为三种,全局路由、组件内路由,路由独享。 路由守卫的目标是在路由跳转之前,实现一个权限判断

//语法:router.beforeEach((to,from,next) => {}
 
let isLogin = false; //未登录
router.beforeEach((to,from,next) => {
//路由跳转“之前”先执行这里,决定是否跳转
if (to.path === '/yourLogin' && isLogin === false) {
alert("请登录”)
next(false) //阻止路由跳转
}else {
next() //正常放行
}
})

vue中路由守卫分:全局路由守卫、组件内路由守卫、路由独享守卫 全局路由守卫:beforeEach、beforeResolve、afterEach; 组件内路由守卫:beforeRouterEnter、beforeRouteUpdate、beforeRouteLeave; 路由独享守卫:beforeEnter

Vue 的最大的优势是什么?

1、Vue.js 可以进行组件化开发,使代码编写量大大减少,读者更加易于理解。 2、Vue.js 最突出的优势在于可以对数据进行双向绑定。 3、使用 Vue.js 编写出来的界面效果本身就是响应式的,这使网页在各种设备上都能 显示出非常好看的效果。 4、相比传统的页面通过超链接实现页面的切换和跳转,Vue 使用路由不会刷新页面。 5、vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要请求所有数据和 dom, 这样大大加快了访问速度和提升用户体验。 6、而且他的第三方 UI 组件库使用起来节省很多开发时间,从而提升开发效率

Vue 和 jQuery 两者之间的区别是什么?

一、Vue 和 jQuery 对比 jquery是使用选择器()选取DOM对象,对其进行赋值、取值、事件绑定等操作,和原生的HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和界面是在一起的。

二、Vue 则是通过Vue对象将数据和View完全分离开来了。对数据进行操作不再需要引用相应的 DOM 对象,他们通过 Vue 对象这个 vm 实现相互的绑定。这就是 MVVM。

mvvm 和 mvc 区别是什么?哪些场景适合?

区别: mvc:  Model-View- Controller (单向通信-模型-视图-控制器) mvvm:  Model-View-ViewModel (数据的双向绑定-模型-视图-视图模型) mvc:MVVM 其实区别并不大。都是一种设计思想,MVVM 主要解决了 MVC 中大量的 DOM 操作使页面渲染性能降低,加载速度变慢,影响用户体验。

使用场景: 数据操作比较多的场景,需要大量操作 DOM 元素时,采用 MVVM 的开发方式,会更加便捷. 如上题Vue 和 jQuery 的区别

Vue 数据双向绑定的原理是什么?

Object.defineProperty 和 Proxy 的区别

请说下封装 Vue 组件的过程?

Vue 组件如何进行传值的?

组件中写 name 选项有什么作用?