• 前端常见问题(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:文字超出省略

    1. //单行显示
    2. overflow : hidden;
    3. text-overflow : elipsis;
    4. write-space :nowrap;
    5. width : 100px;
    6. //多行显示
    7. display: -webkit-box;
    8. -webkit-box-orient: vertical;
    9. -webkit-line-clamp: 3;
    10. 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.里面有两个方法 :

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

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

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

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

    1. <router-link :to="{name: '路有名'}"></router-link>
    2. <router-link :to="{path: '路有路径'}"></router-link>
    3. 2. query传参
    4. this.$router.push({name:'home',query: {id:'1'}})
    5. this.$router.push({path:'/home',query: {id:'1'}})
    6. // html 取参 $route.query.id
    7. // script 取参 this.$route.query.id
    8. 3. params传参
    9. this.$router.push({name:'home',params: {id:'1'}}) // 只能用 name
    10. // 路由配置 path: "/home/:id" 或者 path: "/home:id" ,
    11. // 不配置path ,第一次可请求,刷新页面id会消失
    12. // 配置path,刷新页面id会保留
    13. // html 取参 $route.params.id
    14. // script 取参 this.$route.params.id
    15. 4. query和params区别
    16. query类似 get, 跳转之后页面 url后面会拼接参数,类似?id=1, 非重要性的可以这样传, 密码之类还是用params刷新页面id还在
    17. 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更新后的状态,比如希望后去列表更新后的高度。

  • 相关阅读:
    HP惠普光影精灵7笔记本Victus by HP 16.1英寸游戏本16-d0000原装出厂Windows11.21H2预装OEM系统
    前端安全策略保障
    冰蝎Java WebShell免杀生成 -- ByPassBehinder4J​
    计算机毕业设计Python+djang企业it资产管理系统(源码+系统+mysql数据库+Lw文档)
    听GPT 讲Rust源代码--library/std(15)
    用于准确量化颅面对称性和面部生长的 3D 头影测量方案(Matlab代码实现)
    HTML期末学生大作业-拯救宠物网页作业html+css
    golang channel底层结构和实现
    一台服务器上部署 Redis 伪集群
    基于php停车场
  • 原文地址:https://blog.csdn.net/xm_w_xm/article/details/107534712