小米 前端实习生 一面(凉经)
彼此自我介绍,问了下能实习的时间
项目及VUE
1、IM在线聊天系统实现了哪些内容,怎么实现的群聊
2、websocket断开连接了怎么处理(答了轮询,但实际没去实现)
3、开发人才管理系统遇到的难题(答的权限)
4、为什么选择使用路由的懒加载(用的import)
5、了解路由中的addRouters吗(只知道,没有用过。下来看了资料知道可以用addRouters实现前端权限分配)
6、vue2的双向绑定
7、data中定义的属性如果没有在template中使用的话是响应式的吗(正确答案:不是)(开始答错了,然后给面试官给我讲解了只有使用了才会对他响应式处理)
8、路由的常见模式,有了解原理吗,history模式打包后打开页面为空白是个怎么回事(只说了hash模式跟history模式,以及他们在路由样式的区别,具体原理并不是很清楚,空白页说的是因为打包后路径有问题,需要我们在设置中对路径进行修改,常见方法是 / 改为 ./ )
9、watch与computed的区别(面试官给我补充了下watch除了data中的属性可以监听,还可以对props、$route、$emit、computed等内容进行监听)
10、父子组件传值,兄弟组件传值
11、了解vuex吗(不怎么了解,只知道结构😅)
JS
12、手写实现instanceof(当时写的有问题,但思路对的)
正确代码:
function myInstanceOf(left, right) { let prototype = right.prototype left = left.__proto__ while (true) { if (left !== prototype) return false if (left === prototype) return true left = left.__proto__ } }
13、事件循环打印题(当时反复问我确认结果吗,还改动吗。哈哈哈哈还好没改)
(因为不太确定then的输出时机,面试管顺带问了事件循环,回答了下宏任务微任务、同步代码异步代码,整个的执行顺序
console.log('1'); setTimeout(function () { console.log('2'); new Promise(function (resolve) { console.log('3'); resolve(); }).then(function () { console.log('4'); }); }); new Promise(function (resolve) { console.log('5'); resolve(); }).then(function () { console.log('6'); }); setTimeout(function () { console.log('7'); new Promise(function (resolve) { console.log('8'); resolve(); }).then(function () { console.log('9'); }); });
正确答案:1、5、6、2、3、4、7、8、9
then是微任务所以在Prmoise的内容执行完后执行
14、一道有些难度的for in输出判断,面试官顺带说了下for of,以及其他遍历方法
Object.prototype.a = 10; var s = Symbol() var obj = { [s]:20, b:30 } Object.defineProperty(obj,'c',{ value:40 }) for(let val in obj){ console.log(val) } // console.log(Object.keys(obj));//b //console.log(Object.getOwnPropertyNames(obj));//b、c // console.log(Reflect.ownKeys(obj))//b、c 、symbol
正确输出:b,a
解释:for in 遍历输出的是对象自身的属性以及原型链上可枚举的属性(不含Symbol属性)(Object.defineProperty需在内设置enumerable:true才可使其为可枚举),原型链上的属性最后输出说明先遍历的是自身的可枚举属性,后遍历原型链上的。
Object.keys()
遍历对象返回的是一个包含对象自身可枚举属性的数组(不含Symbol属性)。
Objcet.getOwnPropertyNames()
输出对象自身的可枚举和不可枚举属性的数组,不输出原型链上的属性
Reflect.ownKeys()
返回对象自身的所有属性,不管属性名是Symbol或字符串,也不管是否可枚举。
15、算法
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词(用for循环实现)。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
function words(stra,strb){ if(stra===strb)return true if(stra.length!==0 && strb.length===0)return false if(stra.length===0 && strb.length!==0)return false let map=new Map() for(let i=0;i<stra.length;i++){ if(map.has(stra[i])){ map.set(stra[i],map.get(stra[i])+1) }else{ map.set(stra[i],1) } } for(let j=0;j<strb.length;j++){ if(map.has(strb[j])){ map.set(strb[j],map.get(strb[j])-1) } else{ return false } } // for (let [key, value] of map.entries()) { // if(value!==0)return false // } map.forEach(function (key,val){ if(val!==0) return false }) return true }
现在下来了想了下,可以把他们变成数组,排序之后一次循环比较就可以。
反问:
小组技术栈和小组负责内容:vue,react都有,负责手机端画报部分前端以及电脑软件的前端部分
给我的建议:对不熟悉的地方去掌握了解下(估计是对我eventloop那里不太自信提出的建议),前端重要的还是把基础要掌握熟悉。
整个下来一个小时多点,总来说答得还算七七八八,但是代码方面就还是感觉自己明显的欠缺,并且还是要把基础搞牢哇😣😣
#小米面试##前端##面试题目##小米#