2023-05-12 05:44:00
嗨喵互动前端一面主要涉及自我介绍、前端技术问题及反问环节,具体内容如下:
一、面试概况
二、面试问题
自我介绍
需提前准备简洁清晰的自我介绍,涵盖技术栈、项目经验及个人优势。
数组去重
常见方法:
Set:利用Set数据结构的唯一性,例如[...new Set(array)]。
filter:通过索引判断是否为第一次出现,例如array.filter((item, index) => array.indexOf(item) === index)。
reduce:遍历数组并累加不重复元素,例如array.reduce((acc, cur) => acc.includes(cur) ? acc : [...acc, cur], [])。
this指向
默认绑定:非严格模式下指向全局对象(如浏览器中的window),严格模式下为undefined。
隐式绑定:由调用对象决定,例如obj.func()中this指向obj。
显式绑定:通过call、apply、bind强制指定this。
new绑定:构造函数中的this指向新创建的对象。
箭头函数:继承外层作用域的this,无自身this绑定。
浏览器事件循环机制
宏任务(MacroTask):包括setTimeout、setInterval、I/O操作、UI渲染等。
微任务(MicroTask):包括Promise.then、MutationObserver等。
执行顺序:同步代码 → 微任务队列 → 宏任务队列,每次循环优先清空微任务队列。
并发量大和计算量大哪种适合JS
并发量大:JS适合处理高并发场景(如Node.js事件驱动模型),但需注意单线程阻塞问题。
计算量大:JS单线程特性导致长时间计算会阻塞主线程,需通过Web Worker或拆分任务优化。
bind执行结果
作用:返回一个新函数,固定原函数的this值,并可预设部分参数。
示例:const obj = {a: 1}; function func() {console.log(this.a);} const boundFunc = func.bind(obj); boundFunc(); // 输出1。
Promise
状态:Pending(进行中)、Fulfilled(已成功)、Rejected(已失败)。
链式调用:通过.then()和.catch()处理异步结果,避免回调地狱。
静态方法:如Promise.all()、Promise.race()等。
MVVM
Model:数据层,负责数据操作。
View:视图层,展示用户界面。
ViewModel:连接Model和View的桥梁,通过数据绑定实现双向通信(如Vue的响应式系统)。
async/await
本质:基于Promise的语法糖,使异步代码更像同步代码。
规则:await必须用在async函数中,且await后需接Promise对象。
错误处理:通过try/catch捕获异常。
Vue插槽
普通插槽:通过<slot>定义内容分发出口,子组件中未定义的内容会回退到默认插槽。
具名插槽:通过name属性区分多个插槽,例如<slot name="header"></slot>。
作用域插槽:子组件向插槽传递数据,父组件通过v-slot接收并渲染,例如:
<!-- 子组件 --><slot :user="user"></slot><!-- 父组件 --><template v-slot:default="slotProps"> {{ slotProps.user.name }}</template>三、反问环节
四、面试建议