这篇文章用于记录本人在面试找实习的时候,在一面中面试官问到的问题,以及本人搜集到的答案,分享给大家。该篇文章会随着我的面试次数时时更新,直到我找到实习为止。由于我的阅历太浅,欢迎各位大佬补充指正。
问题1: forEach、filter、map这三者的区别 ?
(1)forEach( )方法会针对每一个元素执行提供的函数,对数据的操作会改变原数组,该方法没有返回值,该方法只能遍历数组,无法遍历对象。
(2)filter( )方法用于筛选数组中满足条件的元素,并返回一个新数组,但该方法不会对空数组进行判断。
(3)map( )方法用于对数组进行指定的操作,该方法不会改变原数组的值,会返回一个处理之后的新数组。
问题2: 请说出 Promise 的三个状态?
(1)Pending(待定):初始状态,既不是成功,也不是失败。
(2)Fulfilled(已实现):说明着操作成功完成。
(3)Rejected(已拒绝):说明着操作失败。
问题3:cookie、localStorage 和 sessionStorage 三者之间的区别?
(1)生命周期:cookie 可以设置失效时间,默认是关闭浏览器后失效。loaclStorage 除非手动清除,否则将会永久保存。sessionStorage:仅在当前网页会话下有效,关闭页面或浏览器后就会被清除。
(2)存放数据大小:cookie 大小为 4KB 左右,localStorage 和 sessionStorage 可以保存 5MB 的信息。
(3)HTTP请求:cookie 每次都会携带在 HTTP 请求头中,如果使用 cookie 保存过多数据会带来性能问题。localStorage 和 sessionStorage 仅存在客户端(浏览器)中保存,不参与和服务器的通信。
问题4:请说出浅拷贝和深拷贝的区别?如何实现浅拷贝和深拷贝?
(1)浅拷贝和深拷贝的区别:浅拷贝是指在复制对象或数组时,只复制一层对象的引用,而不是实际对象本身,新对象和原对象共享同一个内存地址,对其中的一个进行修改会影响到另一个对象。深拷贝是指在复制对象或数组时,不仅复制对象本身,还要递归的复制对象的所有子对象,使新对象和原对象完全独立,互不影响。
(2)浅拷贝的实现:① Object.assign( ) 方法可以把任意多个的源自身的可枚举属性拷贝给目标对象,然后返回目标对象 ② loadsh.clone 方法 ③ Array.prototype.concat 方法 ④ 扩展运算符 ...
(3)深拷贝的实现:① JSON.parse(JSON.stringify()) ② lodash.cloneDeep 方法
问题5:隐藏元素的方法有哪些?
(1)display:none 渲染树不会包含该渲染对象,该元素不会在页面中占据位置,也不会响应绑定的事件监听器。
(2)visibility:hidden 元素在页面仍占据空间,但是不会响应绑定的监听事件。
(3)opacity:0 将元素的透明度设置为 0,在页面中占据空间,而且会响应绑定的监听事件。
(4)z-index 设置为负值,使其它元素遮盖住该元素,实现隐藏。
(5)position:absolute 通过绝对定位将将元素移除可视区域,实现隐藏。
问题6:JavaScript 有哪些数据类型?
(1)基本数据类型:Number、String、Boolean、Undefined、Null、BigInt、Sysbol
(2)引用数据类型:Object(对象、数组和函数)
问题7:请说出 == 和 === 的区别?
(1)两个等号 ( == ):等于操作符,两边的操作数值相等,则返回 true。
(2)三个等号 ( === ):全等操作符,两边的操作数类型相等且值相等,才返回 true。
问题8:请说出 let、const、var 的区别?
(1)变量提升:let、const 不存在变量提升,var 存在变量提升。变量提升是指在声明函数会被提升到当前作用域最顶部去,并且赋值一个初始值 undefined。
(2)块级作用域:let、const 存在块级作用域,var 不存在块级作用域。
(3)重复声明:let、const 不允许重复声明,var 允许重复声明,后面声明的会覆盖先声明的。
(4)修改声明的变量:let、var 可以修改声明的变量,const 声明的是一个常量,不能修改常量的值。
问题9:如何改变 this 的指向?以及对他们的优先级进行排序?
(1)new 绑定:在构造函数中使用 new 来创建一个实例,这时构造函数的 this 指向会绑定在新创建的实例上。
(2)显式绑定:通过 call、apply、bind 方法显示绑定来改变 this 的指向。
(3)隐式绑定:根据调用位置是否有上下文对象进行绑定,如果有的话则会将函数的 this 绑定到这个上下文对象中。
(4)默认绑定:在严格模式下,会绑定到 undefined,否则会绑定到全局对象中。
(5)优先级排序:new 绑定 > 显式绑定 > 隐式绑定 > 默认绑定
问题10:请问 call、apply、bind 方法的区别?
(1)apply 和 call 的区别:apply、call 都是指定的上下文中立即调用函数,但是 apply 传入的第一个参数指定了函数体内 this 对象的指向,第二个参数为一个带下标的集合
(2)bind 和 apply、call 的区别:bind 创建了一个新函数绑定上下文,需要手动调用该函数。可以通过 bind 来实现柯里化。
问题11:Promise 的返回值?
(1)new Promise 的返回值是一个 Promise 对象,对象中的状态和值,根据new promise中同步代码的逻辑决定。
(2)Promise.then 的返回值的一个 Promise 对象,对象的值由回调函数的值决定,如果回调函数没有明确指定的返回值,则返回值 === undefined。
问题12:说说你对闭包的理解,以及闭包的使用场景。
(1)闭包的理解:闭包就是有权访问另一个函数作用域变量的函数。本质上是将函数内部和外部连接的桥梁。
(2)闭包的使用场景:自执行函数、函数柯里化、迭代器、节流反抖、链式调用、返回值
问题13:说说你对防抖和节流的理解。如何实现防抖和节流?
(1)防抖:如果某个事件在短时间内被触发多次,那么只响应最后一次的触发。防抖的实现可以通过定时器 setTimeout 和 clearTimeout 实现。
(2)节流:节流是指在指定的时间间隔内只会执行一次任务。节流的实现可以通过节流阀、时间戳来实现。
问题14:说说 V-model 的实现原理。
(1)实现原理:父组件通过 v-bind 绑定 value 属性的值,并且通过 v-on 绑定 input 事件监听函数中最新获取的值,赋值给绑定的属性中。
问题15:说说 vue 中有哪些生命周期函数?
(1)生命周期函数:挂载阶段(beforeCreate、Created、beforeMounted、Mounted),更新阶段(beforeUpdate、Updated),销毁阶段(beforeDestory、Destroyed)。
问题16:请说出 webpack 和 vite 的区别。
(1)打包速度:Vite 的打包速度相比于 Webpack 更快,是因为 Vite 使用了现代浏览器的功能和缓存机制,避免了重复的编译和打包步骤,以及更高效的利用了现有的资源和模块。
(2)生态成熟度:Webpack 拥有庞大的生态系统,有非常多的 loader 和 plugin 可供选择。Vite 生态成熟度不如 Webpack,但在很大程度上也满足常规的开发。
问题17:请说出 Vuex 和 Pinia 的区别。
(1)Pinia 没有 mutation,只有 state、getters、action 来修改数据。
(2)Pinia 默认储存在内存中,如果需要进行本地储存需要下载插件,这个比 vuex 麻烦。
(3)Pinia 不需要配置 modules,它的每一个仓库都是独立的。
(4)Pinia 有更好的 TypeSctript 支持。
有些问题忘记了,等我想到再持续更新,欢迎各位大佬在评论区留言纠错补充,后续在我找到实习之前,都会持续为大家更新,需要的朋友可以点个star,关注一下~