0
点赞
收藏
分享

微信扫一扫

常见前端面试题(三)

想溜了的蜗牛 2022-01-11 阅读 61
前端

1.递归

递归:简单地说就是,函数自己调用自己。

实际应用场景:数组扁平化和树形结构。

2.eventloop事件循环

JS 代码的执行分为 同步任务代码 和 异步任务代码。

当碰到同步代码时,直接在执行栈中执行;

当碰到异步任务并且时机符合时(例如定时器的时间到了),就把异步代码添加到任务队列中;

当执行栈中的同步代码执行完毕后,才去任务队列中把异步代码拿到执行栈中执行;

其实这种反复轮循 任务队列的过程就是 Event Loop。

3.深拷贝和浅拷贝

1.深拷贝拷贝的是堆中的值,浅拷贝拷贝的是栈中的地址;

2.深拷贝的数据修改后不会影响原数据,浅拷贝的数据修改后会影响原数据。

浅拷贝的方法:Object.assign() 、... 扩展符。

深拷贝:JSON.parse(JSON.Stringify(object)) ,lodash.cloneDeep.

4.get请求和post请求的区别

1.作用不一样 get请求数据,post发送数据。

2.参数 :get参数写在query中,在URL可见、post写在body里,URL不可见;所以,post的安全性比get高;

3.缓存: GET 请求可被缓存, POST 请求不会被缓存,因此,刷新页面的时候,post 回退要重新发送请求,get 回退不会影响数据;

5.事件冒泡和事件捕获

事件冒泡: 在一个对象上触发事件,会向父级对象逐层传播,直到事件被处理(从目标元素 到 根元素)。

使用:事件委托。

事件捕获:同类型事件会由 根—>目标的祖先素—>目标的父元素—>目标元素.

6.事件委托

原理:事件冒泡;

就是把事件处理函数添加到上级元素上。避免了把事件处理器添加到多个子级元素上。

作用:减少事件注册,节省内存,提高性能。

7.哈希路由和history路由的原理

history模式:用的 history.pushState 方法(或者history.replaceState)API并且 监听popstate事件来实现的;history.pushState 会追加历史记录,并更换地址栏地址信息。

hash模式:原理是通过监听hashChange事件来实现的。

#后面的字符称之为 hash,用 window.location.hash 读取。

8.哈希路由和history路由的区别

1.是原理不同: history模式是用的 history.pushState 方法(或者history.replaceState)API并且 监听popstate事件来实现的;history.pushState 会追加历史记录,并更换地址栏地址信息。

hash模式的实现原理是通过监听hashChange事件来实现的。

2.表现不同 hash模式会在地址栏中有#号,而history模式没有,浏览器的兼容性有要求(IE >= 10);

3.history模式开发的SPA项目,需要服务器端做额外的配置,否则会出现刷新白屏(链接分享失效)。

hash 是用hsah值来模拟 一个完整的 URL地址;

相同:两个都不用重新刷新加载。

白屏原因:页面刷新时,浏览器会向服务器真的发出对这个地址的请求,而这个文件资源又不存在,所以就报404。处理方式就由后端做一个保底映射:所有的请求全部拦截到index.html上。

监听popstate事件是为了实现浏览器的前进后退。

9.v-mode和.sync的对比

相同点: 都是语法糖,都可以实现父子组件中的数据的双向通信。

不同点:

1.格式不同。

v-model: 修改数据时,在父组件中定义一个@input方法,子组件使用$emit()调用input方法。v-mode语法糖 常用于 表单和元素的双向绑定。

.sync: 父组件中不用自定义函数,子组件使用$emit()调用update方法。

2.v-model只能用一次;.sync可以有多个。

3.vue3中没有.sync了,.sync和v-model 统一成了v-model,也可以使用多次。

10.vuex的基本使用步骤

vuex是一个全局的一个状态管理器,使用过程如下:

组件里 dispatch 一个 Actions 发送请求,Actions 里面请求API,拿到结果之后,使用 Commit 调用 Mutation 去改变 State 中的数据 ,State 中的数据是响应式的,变化之后,会通过 Render 渲染 组件。

vuex中还有一个配置项(插件),plugins 包 vuex-persistedState。

vuex的使用场景:组件保存数据 或者 数据需要在多个组件里面来回调用的。

11.组件之间传参方式

基本传值方式有三种:

父传子:父组件通过自定义指令传递数据,子组件通过props接收;

子传父:父组件提供自定义事件,子组件通过$emit 触发事件,触发的时候把数据传过去,父组件拿到数据后可以进行操作。

兄弟组件之间:通过事件中心去做,new Vue()拿到vue实例(事件中心),哪个组件需要触发,就在哪个组件里通过$emit触发事件,触发的时候可以传参,哪个地方需要接收,就在那个组件通过事件中心.$on进行监听

vue3里面$on被干掉了,可以用包来处理

跨组件传值:爷爷传孙子,通过provider 提供数据, 用 inject 来接收数据。孙子不能直接修改爷爷的数据,可以让爷爷再传一个调用的方法,

事件中心的原理发布订阅模式

其他方式:

ref : 比如父传子,用 ref 也可以,ref可以拿到一个组件的实例,拿到组件的实例之后,就可以使用组件里所有的实例和方法。

子组件标签放一个 ref = ‘refName';

父组件可以通过 this.$refs.input.focus() 使子组件中的 input 聚焦。

应用场景:弹框组件

vuex:对于全局共享的一些数据,会使用vuex。

this.$parent和this.$children

this.$parent/或者$root 可以拿到父组件实例, this.$children 可以拿到子组件实例,拿到实例就可以操作组建中的数据和方法。

以及上面提到的,v-model 和 .sync 也可以用来组件间传值。

12.mutation和action的使用区别

1.修改数据的方法不同:提交 mutation是唯一可以修改store中数据的方法;Action 不能直接修改数据,要通过提交 mutation来更改数据。

2.调用方法不同:mutation==> store.commit ('事件类型 ') , Action ==》store.dispatch

3.操作的方法类型不一样: mutation必须是同步函数,Action 可以包含异步操作。

13.computed属性和watcher的使用区别

1.computed 是计算一个新的属性,并将该属性挂载到 vm(Vue 实例)上,而 watch 是监听已经存在且已挂载到 vm 上的数据,所以用watch也可以监听计算属性。

2.computed 本质是一个观察者,返回值会被缓存,只有当依赖变化后,第一次访问 computed 属性,才会计算新的值。(基于它们的响应式依赖进行缓存的)。而watch 则是当数据发生变化便会调用执行函数

3.使用场景:computed 一个数据的值 依赖 多个数据的变化;

watch 一个数据变化后会影响多个数据。执行异步或开销较大的操作时候使用。

14.vue2中v-model是一个语法糖,那具体是怎么实现的?

v-bind:value='vaue值'

v-on:input='处理事件'

vue-model是通过input v-bind绑定属性的值 利用绑定事件v-on来监听输入域内容的变化, 使输入域中的最新的数据覆盖原来的数据 来实现v-model 的双向数据绑定。

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

相同:都能控制DOM元素的显示与隐藏。

但是有三点不同:

1.原理不同:v-if是通过创建和销毁节点。v-show通过css控制;

2.效率不一样:v-if 的性能消耗更高;

3.应用场景不同:v-if切换频率不高情况下用,v-show切换频繁的情况。

举报

相关推荐

0 条评论