前端常见问题(vue-题库一)

最近关注了一下前端面试题可以和大家 分享一下,有些解释的不全面或者不对的地方可以指正交流一下

问题1:vue响应式原理

1、data属性转换为getter ,setter 并记录相应的依赖,改变时会通知相应的依赖

2、每个组件实例都有相应的watcher实例,watcher实例会依赖于相应的setter

3、当数据变化时setter会被调用,setter会通知相应的watcher,相应的watcher会更新视图

问题2:v-model 双向绑定的原理是什么

答:v-model双向绑定原理主要是通过数据劫持实现和vue发布订阅者模式

主要是双向绑定得的实现主要依赖于Object.defineProperty(),通过这个函数可以劫持所有的属性,到dep中,当数据改变的时候会通知watcher,watcher会更新视图

发布订阅者模式,比如,你去书店要买本书,但是书没有了,但是可以留下电话,等到书到了通知你,那么客户留下电话就是订阅者,等书到了之后书店统一将预留电话的那个册子上的人一一通知,这个就是发布者模式

问题3:v-for 为什么要加key

答:使用v-for更新已渲染的元素列表时,默认用就地复用策略;列表数据修改的时候,他会根据key值去判断某个值是否修改,如果修改,则重新渲染这一项,否则复用之前的元素;

https://www.jianshu.com/p/4bd5e745ce95  这个文章说的很好

问题3:文字超出省略

//单行显示
overflow : hidden;
text-overflow : elipsis;
write-space  :nowrap;
width : 100px;
//多行显示
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;

问题4:vue computer 和watch 区别

答:

计算属性computed : 

1. 支持缓存,只有依赖数据发生改变,才会重新进行计算

2. 不支持异步,当computed内有异步操作时无效,无法监听数据的变化

3.computed 属性值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data中声明过的数据通过计算得到的

4. 如果一个属性是由其他属性计算而来的,这个属性依赖其他属性,是一个多对一或者一对一,一般用computed

5.如果computed属性属性值是函数,那么默认会走get方法;函数的返回值就是属性的属性值;在computed中的,属性都有一个get和一个set方法,当数据变化时,调用set方法。

侦听属性watch:

1. 不支持缓存,数据变,直接会触发相应的操作;

2.watch支持异步;

3.监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值;

4. 当一个属性发生变化时,需要执行对应的操作;一对多;

5.里面有两个方法 :

immediate: true 
表示在watch中首次绑定的时候,是否执行handler,值为true则表示在watch中声明的时候,就立即执行handler方法,值为false,则和一般使用watch一样,在数据发生变化的时候才执行handler。
deep: true
当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。

问题5:vue中的data为什么是函数不是对象

如果两个实例引用同一个对象,当其中一个实例的属性发生改变时,另一个实例属性也随之改变,只有当两个实例拥有自己的作用域时,才不会相互干扰。这是因为JavaScript的特性所导致,在component中,data必须以函数的形式存在,不可以是对象。组建中的data写成一个函数,数据以函数返回值的形式定义,这样每次复用组件的时候,都会返回一份新的data,相当于每个组件实例都有自己私有的数据空间,它们只负责各自维护的数据,不会造成混乱。而单纯的写成对象形式,就是所有的组件实例共用了一个data,这样改一个全都改了。

问题6:v-router 路由跳转的方法

<router-link :to="{name: '路有名'}"></router-link>
<router-link :to="{path: '路有路径'}"></router-link>
2. query传参 
 
this.$router.push({name:'home',query: {id:'1'}})
this.$router.push({path:'/home',query: {id:'1'}})
 
// html 取参  $route.query.id
// script 取参  this.$route.query.id
 
3. params传参
 
this.$router.push({name:'home',params: {id:'1'}})  // 只能用 name
 
// 路由配置 path: "/home/:id" 或者 path: "/home:id" ,
// 不配置path ,第一次可请求,刷新页面id会消失
// 配置path,刷新页面id会保留
 
// html 取参  $route.params.id
// script 取参  this.$route.params.id
 
4. query和params区别
query类似 get, 跳转之后页面 url后面会拼接参数,类似?id=1, 非重要性的可以这样传, 密码之类还是用params刷新页面id还在
 
params类似 post, 跳转之后页面 url后面不会拼接参数 , 但是刷新页面id 会消失

问题7:行内和块状元素有哪些,区别在哪里

答:

HTML块状元素独占一行,可控制大小。可以设置margin、padding属性

HTML块状元素不独占一行,不可控制大小。仅可设置margin、padding的左右属性

问题8:清除浮动有哪些方法

清除浮动的最常用的四种方法,以及优缺点_h_qingyi的博客-CSDN博客_清除浮动 这个文章写得很详细

问题9:如何理解js this

如何理解JS中this指向的问题 - 土土皮皮 - 博客园

问题10:原始类型和引用类型有什么区别

1.原始数据类型包括:Number.String. Boolean. Null. Undefine.
2.引用数据类型包括:对象. 数组. 函数
3.存储位置不同:原始数据类型存储在栈中,占据空间小,大小固定,属于频繁使用数据。引用数据类型存储在堆中,占据空间大,大小不固定。
4.传值方式不同:基本数据类型按值传递,无法改变一个基本数据类型的值。引用数据类型:按引用传递,引用类型值可改变。
5.1和Number(2)区别
1是基本数据类型,Number(1)是包装对象类型。

问题11:如何深度克隆对象

问题12:promise是同步的还是异步的

promiss 本事是同步的,他的then 和catch 方法是异步的​​​​​​​

问题13:事件循环

事件循环(Event Loop)_旺仔小拳头I的博客-CSDN博客_事件循环

事件循环包括
同步任务:在主线程上执行

异步任务:现在任务队列中执行(分为宏任务和微任务)

宏任务:stript(整块代码)、setTimeOut、setInterval、I/O、UI交互、setImmdiate

微任务:Promise的then、catch、finally和process的nextTick都是微任务

若同时存在promise和nextTick,则先执行nextTick

同步任务>微任务>宏任务

问题14:如何防止冒泡

事件冒泡:

从最具体的元素到不具体的元素(由内到外)

当子元素(事件源)事件触发,事件会沿着包含关系,依次往上级传递,每一级都可以感知到事件,直到触发根元素(根源)

方法一:在相应的函数中加上event.stopPropagation()

方法二:判断event.target 和 event.currentTarget是否相等

event.target:指真正触发事件的元素

event.currentTarget:指绑定了事件监听的元素(触发事件元素的父级元素)

这时判断两者相等,则执行相应的处理函数;当事件冒泡到上一级时,event.currentTarget变成 了上一级元素,这时候判断二者不相等,则就不作响应处理逻辑。

方法三:​​​​​​​event.preventDefault() 事件处理过程中,不阻击事件冒泡,但阻击默认行为(它只执行所有弹框,却没有执行超链接跳转)

问题15:箭头函数 普通函数的区别

箭头函数
1、只有一个参数的时候,参数可以不加小括号,没有参数或2个及以上参数的,必须加上小括号
2、返回语句只有一条的时候可以不写{}和return,会自动加上return的,返回多条语句时必须加上{}和return
3、箭头函数在返回对象的时候必须在对象外面加上小括号

箭头函数的this指向和普通函数的区别
1、普通函数this指向:
指向它的调用者,如果没有调用者则默认指向window
2、箭头函数指向:
指向箭头函数定义的时候所处的对象,而不是其所使用的时候所处的对象,默认指向父级的this
综上:箭头函数没有自己的this,它的this是继承来的,默认指向它定义的时候所处的对象

箭头函数和普通函数的区别
1、箭头函数是匿名函数,普通函数可以是匿名函数也可以是具名函数
2、箭头函数不能作为构造函数使用,不能使用new关键字
3、箭头函数没有原型,即没有prototype属性
4、call、apply、和bind无法改变箭头函数的this指向,但可以改变普通函数的this指向
5、箭头函数没有arguments对象,如果有外层函数,则继承外层函数的argument是,没有外层函数则会报错,箭头函数用的是rest参数(形式为: …rest)
6、箭头函数没有Generator,不能使用yield关键字
7、箭头函数没有自己的this
原文链接:https://blog.csdn.net/weixin_42178670/article/details/123966265

关于this指向问题的实际例子,这篇文章已经介绍得很清晰了

问题15:nextTick使用和原理​​​​​​​

1、nextTick是等待下一次DOM更新刷新的方法

2、Vue有个异步更新策略,意思是如果数据变化,Vue不会立刻更新DOM,而是开启一个队列,把组件更新函数保存在队列中,在同一事件循环中发生的所有数据变更会异步的批量更新。这一策略导致我们对数据的修改不会立刻体现在DOM上,此时如果想要获取更新后的DOM状态,就需要使用nextTick

3、开发时,有两种场景我们会用到nextTick

  • created中想要获取DOM时
  • 响应式数据变化后获取DOM更新后的状态,比如希望后去列表更新后的高度。

猜你喜欢

转载自blog.csdn.net/xm_w_xm/article/details/107534712
今日推荐