由于本人能力尚有不足,且从业经历不算深厚,因此文中所述多为个人粗浅见解,倘若存在谬误,敬请各位批评指正,若觉不妥,请勿苛责~~
这篇文章或许主要面向刚入行不久的前端开发者,特别是那些毕业不久的年轻人,或者工作时间不超过两年的技术人员,请根据自身情况选择是否阅读,谨慎参考~~~
更新:最后的面试内容仅为自己梳理的部分基础要点,刚入职的新人不必感到焦虑,这并非初级前端必须熟练掌握的范畴,而是前端面试中较为普遍的考察点,面试者多加准备总会有益处ヾ(=・ω・=)o
倘若诸位欣赏,欢迎投下支持或发表评论,我会接着上传面试题目,非常感谢各位~~~
简历的格式
个人履历建议控制在一到两页篇幅,不宜超过两页。制作履历并非单纯堆砌文字,无论是技术人员还是人力资源专员,都不会逐字逐句审阅。因此,履历内容必须精心筛选,务必展现个人长处,突出自身优势。
个人不太欣赏过于花哨的履历,简洁规整的布局即可,不过必须确保没有文字错误,虽然多数人明白那是无心之失,但确实会让人感觉不够专业,至少反映出对自身材料未曾仔细审阅,同时最好能区分大小写,数字与文字之间务必留空,这确实是个良好习惯,之前在参与翻译项目时养成的,如今即便在微信交流中也坚持这样做,显著提升了信息接收的流畅度。
不建议在求职平台上提交格式化的履历,应用演示文稿时需剔除无关内容,= =,曾收到一份简历,首行是 chapter,且未署名,询问对方原因,对方称 chapter 是英文名,= =
对于毕业已满两年者,学生时代的过往履历,诸如曾担任学生会领导职务、荣获过各类荣誉性奖励等,均可省略不填。
简历的内容
制作前端领域的简历,通常包含基础信息、技能清单、职业履历和具体案例等部分。
个人基本信息需包含姓名、联系方式和电子邮箱、完成学业的时间、最高学习阶段、出生的具体月份和年份即可,是否提供个人形象照不作要求,政治立场和原籍地无需填写,联系电话必须确保真实有效且能够接通,曾遇到过简历上电话和邮箱后四位被部分隐藏处理的情况,也碰到过多次拨打仍无法沟通的状况,无论在上班时间还是休息日尝试均无果,即便个人能力再强,若无法取得联系也无法进行后续合作(/\*)
项目经验和投递的 title 相匹配
个人认为,到了 9102 年,掌握 JQ 技能通常没必要再列在个人履历中,但如果你深入探究过(并非仅仅浏览过)JQ 的源代码,可以考虑加上。
此外,个人履历须与应聘职位相符,例如若职位名称为高级前端开发人员,那么掌握运用 div 与 css 进行页面构建的能力便无需在履历中特别注明,毕竟这属于行业内的基础技能。
简历上是要突出你的优势,同时也是自我总结能力的一个体现
简历上写的内容要是你擅长的
面试时很多问题都源自你的履历,因此,那些仅凭找篇文章简单实现的项目,或者只是编写过的 demo,都不必放在简历上。
履历上列出的内容必须是你完全熟悉的,由于前端的技术领域或各类框架不断涌现,应聘者通常不会询问你未曾接触过的框架,那么又该如何判断你的能力呢,就需要从你的履历中进行考察了
我曾见过许多简历写得相当出色,然而实际询问时却一问三不知。例如,有份简历上写着“对面向对象编程有透彻的认识”,我询问:“面向对象的三大要素是什么”,对方回答:“这个抽象的概念记不起来了。”,好吧,我换个问题:“你通常如何运用封装和继承”,回答:“在多数项目中几乎不使用”,接着问:“面向对象与面向过程编程之间有何不同呢?”表述逻辑混乱,语言表达不流畅。遇到此类情形,建议你最好不要在个人履历中提及“对面向对象编程有透彻认识”。因为你若不提及,我或许不会就此提问,但你所具备的实际能力与“有透彻认识”之间,仍存在显著差距,这会成为负面评价。
另外一项是个人履历里技能和项目部分都列了“运用 node 构建个人网站”,恰巧我近期也在进行相关事宜,因此想咨询一下,对方回应称“其实是从网络上找到一篇教程然后依样画葫芦完成,现在已记不清细节”
因此,个人履历中确实应当记录自己十分熟悉的范畴,若仅仅是听闻过某些成就,或者只是简单提及过一些实例,将其列入个人资料反而会起到反作用。
注意用词
简历中对某项技术的描述一般有以下几个词语:
明白:掌握核心定义,曾进行初步尝试 ——“尝试过” 熟稔:各项功能运用自如,具备频繁的操作履历 ——“操作频繁” 精深:透彻把握其内在机制及多种应用手法,并拥有充实的实践积累——“深入钻研”
切记准确用词,慎用“精通”!!
电面
收到求职者的材料后,多数企业会先安排一次电话沟通,具体步骤因单位而异,这样做主要是考虑到费用因素,通过询问一些基本事项,大致能判断应聘者的能力层次,以及是否符合所招职位的条件。
此外,我主张应聘者在获得现场面试邀请前,最好先进行电话交流,倘若直接前往现场面试,至少需要申请半天假期,倘若双方契合度不高,那就避免徒劳往返了。
我们这一轮电话面试侧重考察基础能力,只要应聘者在这方面达到我们的录用标准,就会邀请其参加现场面试环节。
我认为,自身条件较为优越,不仅对 JavaScript 有扎实掌握,同时具备计算机体系结构和编程知识,并且精通至少一种主流框架,对其原理有所领悟,这是基本要求。此外,若曾使用 webpack 构建项目,理解其打包机制,研读过框架源代码,有过性能优化经验,对新兴技术有所涉猎,则更为出色。不过,由于项目未使用 Node.js,所以一般不会考察相关技能,除非简历中有明确说明。
同时也会评估应聘者的综合素养,包括语言组织能力是否流畅,个性是否过于沉静,以及应答是否逻辑分明。
我平时会准备一个常用的面试问题集合,面试时根据应聘者的履历来挑选要提问的内容,比如说,如果履历上写着“精通面向对象”,我就会准备几个关于面向对象的问题。
面试过程结束后,基本上就能判断候选人是否适合该职位,面试时我们会记录候选人的回答,对于有标准答案的问题,考察其回答是否准确,对于没有固定答案的问题,则评估其思考是否缜密。
我的个人理解是,框架相关的 api 大多属于常见的基础类型,目的是测试你掌握的水平如何,通常会询问一些基本原理,例如,vue 的双向绑定机制(包括 vue 2.0 与 vue 3.0 的两种实现方式及其优劣对比)、vue 的 nexttick 机制、diff 算法等。
面试结束后,我们通常会询问应聘者有无问题想问我们,多数应聘者会询问团队负责的业务内容,也有不少人会问技术层面的问题,这个环节主要是观察应聘者的需求,如果你有比较强烈的诉求,可以提出来。
面试结束后通常不会立刻告知结果,往往会说“后续或许会有其他工作人员与您取得联系”,不过依据面试的实际情况,应该能大致心中有数吧= =
不直接提供解答,首先出于尊重他人,其次,或许当时难以迅速得出结论。
一个较为妥当的做法是,面试结束后需要稍作斟酌才能答复,而且通常即便面试未能通过,对方也不会明确告知结果。因此,若一周内未收到人力资源方面的进一步消息,基本上可以认定面试已经落选。
现场面
通常在电话沟通结束后,我们会联系人力资源部门安排实地面谈,关于现场面谈我缺乏足够的实践,以下内容仅供参考。
面试情况因人而异,有的面试官会深入询问专业技能,有的则更关注过往项目经历,我们这边在完成现场技术环节后,会给出一个明确等级,以判断是否符合岗位需求。
通常情况下,在初步沟通环节,若能获得评级,便会邀请技术负责人进行评估,确认无碍后,再安排与人力资源部门进行后续交流。
给刚毕业大学生的一点建议
刚毕业找工作并不是全看技术
刚离开学校那阵子,我以为找职业只看技能,毕竟那是个技术相关的岗位。
目前自身感觉,并与其他人交流过后了解到,技术所占的比重,其实并没有预想中那么大。
我们毕业后一两年内,彼此之间的成就差异并不显著,个人能力的差别也并不悬殊。
当前环境下,或许某些特质更为关键,诸如交流技巧、个人性情、工作作风是否稳重。
求职过程,偶然性和际遇也占据关键位置,例如职位是否属于紧急招聘,倘若属于新设的团队或者有人离职需要填补空缺,这些特殊状况下,条件或许会略微放宽些(但绝不会放宽太多)。
所以最好是找团队人员内推,这样对团队的情况会更加了解。
个人认为,三年后技术上的距离会不断拉大,而且想要弥合这种差距也会变得越来越不容易。
刚毕业尽量去大公司
实际上,这就好比在大学里选择是去顶尖学府还是普通院校,对于那些不想成为大企业普通员工的人,不妨先问问自己有没有资格进入这些公司,不要还没进门就开始抱怨。
有能力去而选择不去和去不了是两个概念。
根据个人以及身边人的实践体会,在大型企业你能获得的成长机会,在多个维度上都要比小型组织略胜一筹,当然,这里所指的小型公司并非那些精悍且高效的企业。
根据个人体会,大型企业并非所有员工都从事单调的重复性工作,因为需要与众多不同部门的人员互动,包括各种类型的前端、后端、产品、设计及测试人员,他们的工作方式各不相同,有时还需进行跨部门协作,而不同团队的技术基础也可能存在差异,因此,个人所接触到的领域是丰富多彩的。
另一方面,小型企业里负责用户界面、系统底层、视觉创意和测试保障的人员构成通常比较稳定,基本上不会涉及不同团队之间的协作,而且技术工具的选择也相对固定,一旦选定一套工具,一般不会轻易调整,因此你在技术能力上的成长空间或许会显得有些受限。
并且大公司的业务复杂程度和用户数量也是小公司所不能提供的。
说实话,履历里要是含有名互联网企业的任职记录,那无疑会增添不少分量,多数情况下都能获得面试机会,毕竟这能节省一部分成本,毕竟能进入这些知名企业,说明自身具备一定竞争力。
不要只会 API,要了解其原理
我们领导时常告诫我们,不应仅满足于了解部分 API。当前前端领域存在一种情况,许多人仅因接触过一些 API,便自认为已掌握相关技能。
要注重一些底层知识,一些原理,这才是长远发展的必备技能。
比如在电话面试时询问:“用简短的话说明下 promise 是什么”,很多人给出的答案是 promise 的具体应用方式。
找工作是双向选择的过程,一个好的团队很重要
求职是一个相互匹配的阶段,企业挑选求职者,求职者也在挑选企业,若能力允许,应优先加入优秀的团队,从事自己感兴趣的业务,至少要避免做自己完全排斥的工作。
其实面试官的素质也能反映出这个团队的整体能力,我个人有个想法是,如果你自己还在进步期,要是面试时的问题你都能轻松应对,那么这份工作你就得好好斟酌下,或许进步的机会就不太多了。
减少跳槽的频率
关于工作调动次数,技术负责人和人力资源部门都会将其纳入考量范围。
近些年,个人觉得变换工作是最容易获得加薪的方法,涨的钱数通常比较多,而在一个单位里等待加薪则相对缓慢。
然而,频繁更换工作单位其实是有害的,个人觉得,每年变动一次工作这样的节奏已经算是偏快了。
京东对此有清晰的规定,采用淘汰机制,同时遵循五年内最多在两家单位就职的准则
关于学历
当前众多机构入行标准为具备本科学历且专业对口,往后标准预计将持续提升。
每个公司要求不一样。
觉得面试中有些问题工作中用不到
许多人常常感到困惑,面试时被问及的诸多问题,在日后从事具体工作时,几乎毫无实际应用价值。
我觉得你会有这样的问题可能是你和这个公司的岗位并不相匹配。
应聘饿了么工作时,对方提出了一些基础的算法题目,并探讨了部分底层机制,不过沟通过程中我夹杂了一些牢骚。
进入公司后,了解到面试时考察的内容在实际工作中经常需要运用,而且自己在面试前准备的题目,也是基于日常工作经验归纳整理的。
当初认为没有必要掌握那些知识,是因为以往的作业情形不够繁难,客户数目也不多,因此某些技能派不上用场,多数产品功能都得自行开发,可用的模块无法应对部分状况。
例如要开发一个公司人员管理系统,针对每个职位执行不同任务,有时要同时运用列表和树形结构,部分结构繁杂的职位包含大量信息,因此必须注重效率提升。
所以面试的时候就会问: 如何遍历一个树,并对其进行优化。
注重底层原理和概念的学习
有人或许会疑惑 基础学问,内在机制究竟有没有价值? 回答是肯定的,它们十分有益!
个人认为,一个人的能力关键在于处理难题的本领,毕竟工作就是不断应对各种挑战,无论是产品方面还是技术方面,核心都是要攻克这些难题。

你掌握更深入的底层学问,理解更根本的运作机制,能够增强你应对挑战的本领,若明白接口背后的运作方式,就能更明智地挑选适用的接口。
熟悉基础理论和核心机制有助于提升故障诊断水平,工作中常会碰到状况:表面看似正常,却发生异常,或者功能失效,又或结果与设想不符,若仅知晓接口调用方法,有时难以有效分析症结所在。
最好从官方文档学习
不知道大家学习知识的时候都是从何种渠道学习的呢?
个人的建议是最好从官方文档学习,遇到问题最好去看下源码。
获取学问最宜从原始资料入手,单纯研读他人撰写的文章是不足够的,这好比吞食他人已咀嚼过的食物,即便是本篇文字,我也无法担保其中所有见解和论据的精准,不过,倘若你对某个概念认识模糊,参考不同人的阐释同样能对你有所裨益。
下面是我个人的面试题
部分面试题(答案仅供参考,不保证其正确性)
CSS
Q1:怎么实现三列布局(左侧和右侧宽度固定,中间自适应)
这个问题主要想考察面试者的思考是否存在局限,采用这种布局是一种比较普遍且存在多种实现途径的做法,同时也能引导面试者逐一阐述 CSS 相关的基础知识。
绝对定位 + 中间版块不给宽度
两边可以活动调整位置,中间部分会自动增宽,具体宽度通过 calc 函数实时计算,并设定相应的边距值
flex, 在两侧设定尺寸基准, 在中间设定扩展比例
通常情况下,主要有三种排版模式,不过多数人仅提及 flex 布局,另外两种方式稍微思索就能想到(o´゚゚`o),此问题并非要求面试者给出什么特殊技巧,而是检验 CSS 的基本掌握程度。
Q 1-1: flex 布局中,如何达成三栏式排布,左侧和右侧的尺寸怎样确定,中间部分自适应是借助哪个特性
flex 布局中确定元素尺寸和自适应布局是核心技巧,在求职考核时,若被问及如何通过 flex 属性实现宽度配置及中间元素自适应,相当一部分应聘者会表示记不清楚,通常依赖系统默认分配空间
设置为弹性布局后,子元素的宽度不再遵循常规规则,高度也不再固定不变,排列方式会根据容器决定,顺序可能改变,对齐方式会受容器影响,分布方式也会调整,填充行为可能不同,边框大小可能受影响,定位属性会失效,过渡效果会中断,动画状态会停止,重排行为会改变,重绘范围会扩大,交互响应会调整,视觉效果会重置。
float、clear 和 vertical-align
Q 1-3 float/绝对定位 怎么实现中间宽度自适应
Q2: 移动端开发 rem 布局的原理(rem 单位换算)
Q3: 有没有自己写过组件
Q 3-1: 怎么实现样式的继承和复用
Q 3-2: 你平时都是怎么管理自己的 CSS
base.css、common.css、page.css,分别包含哪些具体内容,各自存放着什么资料
Q 3-3: 你日常运用 sass/less/stylus 时,主要用到哪些特性,sass 的动态计算特性是否会对网页运行效率造成作用?
Q4: 如何在页面上画一个圆
SVG
CANVAS
css border-radius
background
map + area
直接放一张圆形图片
Q 4-1: 如何在页面上画一个椭圆
Q 4-2: 如果圆边界模糊,有什么办法去锯齿
这些问题基本上可以掌握面试者日常如何运用 CSS 的方法了,对于 CSS,我认为达到基本要求即可,因为我们目前主要应对的是兼容性挑战,有 babel 支持并且我们的项目无需适配 ie6 等过时的浏览器
JS
Q1: JS 基本数据类型
Q 1-1 JS 数据类型有哪些,其中基本数据类型有哪些
Boolean
Null
Undefined
Number
String
Symbol (ECMAScript 6 新定义)
Object
在ES6标准发布之前,存在五种基础数据类型,分别是字符串、数值、布尔值、空值和未定义值,后来ES6引入的Symbol也属于原始数据类型,它用来表示具有唯一性的标识符。而对象属于引用数据类型,其涵盖范围广泛,其中包括数组和函数。
Q: 1-2 原始数据类型和引用类型的区别
数据存放在内存里的形式不一样,基本类型在内存中采用栈式存放,引用类型则在堆里存放 栈是系统自动管理的内存区域,会自动回收空间;堆是手动分配的内存区域,大小可变且不会自动清除。
数据在内存里的存放办法不一样,使得基本类型不会变,而对象类型会变,基本类型和引用类型赋值时,一个是指值传递,一个是指地址传递
Q: 1-3 深拷贝 和 浅拷贝 的区别
Q: 1-4 怎么实现浅拷贝
ES6:object.assign()
展开运算符…
自己封装函数实现
Q: 1-5 怎么实现一个深拷贝
解析JSON对象,不过当其中包含函数或未定义值时则无法执行
lodash
自己封装
Q: 1-6 null和undefined的差异
相同点:
在 if判断语句中,值都默认为 false
大体上两者都是代表无,具体看差异
差异:
空值转换为数字类型时等于0,而未定义转换为数字类型时得到的是非数值结果
未定义是当尝试获取一个未赋值的变量时产生的状态,这种情况下系统会返回未定义的结果
空值是一个很独特的实体,它最常用的一个用途就是被当作参数传递进去,用以表明这个参数并非一个实体
设置为null的变量或者对象会被内存收集器回收
这个议题属于 JS 核心知识范畴,能够测试应聘者 JS 基础掌握程度
Q2: 实现给数字添加千分位符的方法
正则表达式功能是将数字字符串每三位前插入逗号,原句中指定了字符串"12345678"作为处理对象,使用replace方法配合正则表达式完成转换,其中\d表示任意数字,(?=(?:\d{3})+$)为正向前瞻断言,确保每次匹配到数字后紧跟着的是三位数字的结尾,$代表字符串末尾,g为全局匹配标志,最终将匹配到的数字前加上逗号作为替换内容,得到结果"1,234,567,8"。
字符串分析, 循环,然后3位加','
对数字进行解析,提取其整数部分,执行00运算,接着加上逗号,再将结果与字符串合并拼接
将数字12345678按照美式英语格式转换后显示为"12,345,678"
Q3: 面向对象三大要素
封装、继承、多态
Q3-1: 能够简单的说明面向对象和面向过程的区别吗
按照顺序逐步处理就是先弄清楚解决某个问题需要哪些环节,接着通过函数把每个环节逐一完成,调用时按次序一个接一个地使用即可。
面向对象是将问题中的事务拆分成一个个对象,建立对象是为了说明事物在解决问题过程中所表现出的动作,而不是为了实现某个具体环节。
面向对象: 狗.吃(屎)
面向过程: 吃.(狗,屎)
Q3-4: 怎么实现封装和继承
Q3-5: 一句话概述什么是闭包
Q4: 一句话概述什么是 promise
Promise对象用于处理异步计算,它代表一个尚未完成但预计未来会完成的单一异步操作。