**真的勇士,敢于在跌倒的地方爬起来。**
校招参加的第一场笔试,意料之中的不理想,但是从哪里跌倒的从哪里爬起来,把每次都当作查漏补缺,就没那么难受了(555...)
终于肝完论文了,补上二面凉经。。。
题型
题型分为单选(16*2.5')、多选(4*2.5')、问答(2*10')和编程(2*15')
笔试总体感觉
印象中感觉单选题不难,基本都是基础知识,除了前端必须的一些基础点,数据结构里面堆栈列表二叉树也要知道一点。
多选有一题不太清楚,input的type取值选项,我选了2个,去了MDN看一下,哦豁,这个选择还蛮多,对比一下,我漏选了一个。
简答题自由发挥,CSS选择器优先级和JS垃圾回收,感觉JS垃圾回收回答得不太好,不准确。
两个编程题最耗时间:js 驼峰命名和下划线互换,字母异位词分组(LeetCode原题)。一不小心忘记了时间,只来得及答完一个,结束后一搜,答案特别多,也有很简单的解法。
查漏补缺
**1.垃圾回收机制
JS的垃圾回收机制定期对我们不再使用的变量、对象所占用的内存进行释放。局部变量正常生命周期中只在函数执行过程中存在,垃圾回收方式主要有两种:
一种是标记清除法,当变量进入执行环境时标记为“进入变量”,当变量离开执行环境时标记为“离开环境”,被标记为“离开环境”的变量可以被回收;js中的垃圾收集器运行时会给存储在内存中的所有变量都加上标记,然后去掉环境中的变量以及被环境中的变量引用的变量的标记,此后再被加上标记的变量被视为准备删除的变量,最后垃圾收集器完成内存清除,销毁带标记的值并回收其占用的空间。
一种是引用计数法,统计引用类型变量声明后被引用的次数,当次数为0时,该变量将被回收。本质是跟踪记录每个值被引用的次数。当声明一个变量并将一个引用类型值赋给该变量时,这个值的引用次数为1;若同一个值又被赋值给另一个变量,则该值的引用次数+1,但如果包含这个值引用的变量又取得了另外一个值,则这个值得引用次数-1,当这个值的引用次数为0时,则无法再访问这个值,就可回收其占用的内存空间。
V8引擎的垃圾回收机制,主要使用的是分代回收机制。
V8引擎将保存对象的堆进行了分代:对象最初被分在新生区,新生区的内存分配只需要保有一个指向内存区的指针,不断根据内存大小进行递增,当指针达到新生区的末尾,会有一次垃圾回收清理(小周期),清理掉新生区中不再活跃的死对象。对于超过2个小周期的对象,则需要将其移动至老生区。老生区在标记-清除或标记-紧缩的过程中进行回收。大周期进行并不频繁,通常在移动足够多的对象至老生区后才会发生。
**2.驼峰命名和下划线互换**
// 下划线转换驼峰 function toHump(name) { return name.replace(/\_(w)/g, function(all, letter){ return letter.toUpperCase(); }) }
// 驼峰转下划线 function toLine(name){ return name.replace(/([A-Z])/g, "_$1").toLowerCase(); } ``` 为了避免首字母大写带来的下划线转换,加一个slice()方法: ``` // 驼峰转下划线 function toLine(name){ return name.replace(/([A-Z])/g, "_$1").toLowerCase().slice(1); }
// 测试 let a = 'a_b2_345_cd2345'; console.log(toHump(a)); let b = 'AbCdefGhi'; console.log(toLine(b));
**3.字母异位词分组**
问题:
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"], 输出: [ ["ate","eat","tea"], ["nat","tan"], ["bat"] ]
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
/** * @param {string[]} strs * @return {string[][]} */ var groupAnagrams = function(strs) { let res = {}; let len = strs.length; for(let i=0;i<len;i++){ let s = strs[i].split('').sort().join(''); if(!res[s]){ res[s] = []; } res[s].push(strs[i]) } return Object.values(res); };
通知面试
笔试很久通过复筛进入面试,邮件短信通知2天内电面,面试时间15分钟,因为中间有个周末,实际过了四天,下午直接电话来面的。
自我感觉面的不好,因为最近半个月都没怎么准备面试相关复习。主要问了以下几个问题,都是知道一些,但是感觉没讲清楚,整个过程差不多有30分钟。
面试题
1. vue数据驱动,讲一下vue实现原理。
2. 讲一下什么是虚拟DOM,虚拟DOM实现原理。
3. 数组去重几种方式?
4. vue生命周期的created和mounted,mounted中是否得到数据,生命周期和数据哪个在先?没太理解面试官意图。
5. 小程序用到了云数据库,数据库双表联查怎么实现?
6. 对webpack的了解?
7. 项目中遇到的问题,怎么解决?
8. 对工程化的理解?
9. 组件间通信有哪几种方式?
二面
通过一面大概三四天吧,准备毕业论文最紧张的时候,真的是挤时间复习了一下,主要把之前遇到的不会的重点看了下。可能因为我没有实习经历,面试官反而问的比较简单。然而,虽然面试体验很棒(面试官很nice)但还是挂在二面了。最后给了我一些建议(我请求的),多看看常用的数组字符串高阶函数,实习真正用的东西多了解下,提到我有吃没实习的亏。因为面完又忙着改论文,到现在才写二面面经,题目只记得一部分了。
面试题
1. CSS左定宽右自适应实现
2. CSS动画
3. VUE生命周期(真的重要)
4. 数组常用高阶函数filter、map这些
5. Promise实现