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