京东前端面试经历
京东面试总结
京东面试流程:
1:自我介绍;
2:技术介绍;
3:个人爱好兴趣;
各位面试官问到的技术点
1:前端的发展;
2:你说熟悉的框架;
3:2018年你想去学去做的事情;
4:ajax的实现原理;
5:数组中,的重复元素进行去除;
6:对es6的了解;
7:前拷贝,深拷贝;怎样对一个对象进行深拷贝;
8:react是否了解;
9:列举Jq中常用的方法;
10:H5、css3的了解,常用的元素及属性;
11:echarts,10个柱状图该怎么处理;
12:说下你最近工作期间浏览的网站及书籍名;
13:是否有自己的技术贴:或github上传分享的项目;
14:对字符串进行拼接的几种方法;
面试官:
公司项目组分移动端与pc端;
移动端大概7人;
主要用到的技术react,
前端面试&滴滴实习心得
原文地址在我的博客, 转载请注明出处,谢谢!
从大二下学期放暑假开始(7.14)到8月初,我一直在寻找一份实习,锻炼一下自己,看看学的怎么样。这期间,我相继面试了小米、途牛、滴滴和百度,都拿了实习offer。其中百度拿了两次实习offer,但由于我自身一些原因,都爽约了。(在这里给百度真诚地道个歉,我非常珍视这两次机会,但无奈遇到了不可抗拒的原因,今后有机会还会再投的(˶‾᷄ ⁻̫ ‾᷅˵))最后选择了在滴滴实习,很难得的经历。实习期间一直没空闲下来分享一下,结果拖到了现在...那么这篇文章就来分享一下我的面试和实习心得吧
面试
有一些记不清了,毕竟时间太久了...
小米
- 说一下你的前端学习经历
- css左右边固定宽,中间自适应,有几种方案
- css3动画,transition属性知多少
- 说说你是如何配置你项目里的webpack
- 如何判断变量是true or false
- 数组去重,要求时间复杂度为O(n)
- http状态码,304什么情况
- 跨域方法
- 其他想不起来了...
途牛
- typeof 都返回哪些类型 typeof null 返回什么,为什么?
- cookie和session有什么区别
- 有没有实际写过、解决过跨域相关问题
- 使用过ES6/7哪些特性
- 说说 promise 几个常用API和原理
- React的特性,接着问原理,接着问好在哪里
- 堆和栈的区别
- 其他想不起来了...
滴滴
- React技术栈做项目用到了哪些东西
- React特性、virtual dom、diff 、合成事件、调和等原理
- 为啥要给列表类组件设个key?
- 读过React源码吗?
- 使用过哪些状态管理库,我说Redux,接着问Redux 是如何管理React 的,你又是如何使用Redux架构你的项目的
- Redux 有哪些优缺点
- 了解数据可视化吗?做过之类的东西没有?
- 了解node吗
- 其他记不起来了...总之都是围绕React技术栈来问的,上来就问框架很显然想让你进来直接干活:)
百度(地图事业部)
- 你在滴滴实习,为啥要来百度?(blablabla...夸了百度一番)
- 你在滴滴做什么东西?用了什么东西(数据可视化,还用了你们的echarts呢(/ω\))
- 那你知道echarts有哪些可以优化的地方?读过它的源码吗?
- React 特性、原理,React 突出的思想
- 你是如何使用Redux架构技术栈的
- 我看你用了Redux-saga,它比thunk、promise有啥好处?
- 你使用过哪些ES6 新特性、promise原理
- 跨域的几种方法
- 你这个项目有没有遇到什么你觉得难的问题,你怎么解决的?
- 你有啥想问我的?(一般问部门技术栈、工作氛围)
- 其他记不起来了...
百度(校园品牌部)
- 介绍一下前端经历
- 你平常如何用css管理页面布局的,我说栅格,又问栅格怎么实现的
- css3动画、transition、transform,canvas、svg
- sass跟less的区别?
- javascript 有哪些特性,我说了弱类型、单线程、事件驱动,就有了下面的
- 你怎么理解事件驱动机制的?
- 用过事件委托吗?怎么用的?
- 嗯...ES6 用过哪些新特性?我提到了箭头函数,于是就问
- 箭头函数跟ES5匿名函数有什么区别?我提到了this指向,然后就接着问
- 箭头函数自动绑定this原理是什么?
- 嗯...你这个项目怎么配置webpack的?用过gulp吗?webpack跟gulp有啥区别?
- React 突出的特性
- 怎么用git建立一个远程分支
- Linux命令知多少?
- 怎么把一个链表倒序?
- 其他记不清了....
总结
总的来说,由于面试的特殊时期,面试难度会比春招实习、校招要低很多。
面试会围绕你的简历来问,所以简历写好并且为简历做好准备很重要。
面试大多问的是基础,而且问的很细,经常围绕一个点来深挖,还会问一些经常用到的API,所以面试一定要准备,把一些零碎的知识温习一下,基础很重要。项目问的比较少,但项目决定你简历的质量。
前端要掌握的知识面比较广,但是有一些是构建工程所必须的,最好先培养自己比较全面的基础技术栈,可以足够形成构建一般工程项目的基本能力,然后再深挖。
照目前情况来看,深入理解一门框架是很有必要的,但也没必要多。
前端面试算法问题问的较少(大公司问的较多),但别告诉我你不知道查找、排序、去重、遍历二叉树...
面试一定要保持平和心态,抱着我已经拿到BAT offer的心态,不紧不慢的交谈,用眼神、肢体语言帮助嘴巴说话;择机展示思考的过程,全程展示对这行的热情。
祝愿大家都能找到心仪的实习、工作。
实习
我在滴滴实习了一个多月就走了,原因是学校课太多,导员不让出去,我也意识到了现在还是以学业为重...
实习期间,我参与了两个项目,一个是一个滴滴实时计算平台,另一个是 Druid 管理平台。
实时计算平台,面向滴滴内部工程师,是一个依靠滴滴海量数据完成实时计算、任务调度、自动报警监控等等,项目很大,做了一年了,业界少有吧....我所做的是将我负责的部分数据可视化及国际化;
Druid 管理平台,仍面向内部工程师,是一个可视化数据库管理平台,前端由我和另一位实习生负责。我做的是一期核心模块的开发。
最大的体会就是
- 要对产品有极致追求,不能容忍错误,不能容忍繁琐的操作,还要兼顾所有可能的操作
- 体会到了海量数据下的性能的重要性,开始关注性能优化
- 要抱着后台什么数据都有可能产生的考虑,来写健壮的程序,类型检查、空值检测、try catch是必要的
- 做好渐进增强、功能解耦、组件分离很能体现一个人的编程能力和水平,最忌讳代码粘一块、写死,坑的都是自己,,,
- 调试很重要,要有写debugger的习惯
- 时刻准备迎接新技术,哪怕从未听说,只要项目需要,就得立刻上手(我所在的组还是很喜欢用新技术的,只要它好用,License符合)
- 前后端分离的接口文档遵循规范能少说很多废话
- 项目管理,敏捷开发是很好的方式
- 我所在的组开发项目的流程一般是:老大不知道从哪弄来一个需求(可能上级安排的,很多是自己想的…),然后全员开会说需求、定任务,各成员写排期,后端定具体需求、接口,前端配合后端一同开始,每周报告任务进展...
- 对前端er来说,改需求不用那么在意,我们最终的目的都是让这个产品更好不是吗?
- 实习生很少会接触to C产品,做的大多是面向内部人员,因为出bug好商量嘛...
- 我所在的部门女工程师还是挺多的,这个的确让我很惊讶(No Offense)...
- 想到再补充(/ω\)
这次实习,确实比自学效率高多了,而且最重要的是,开阔了眼界,了解了这行业前沿是个什么情况,大公司又是如何部署前端技术栈开发项目的,以及我自身的不足。我也很幸运,找到了自己感兴趣的方向。
阿里巴巴暑假实习面试总结
2月末的时候,通过 SimplyY 内推了阿里巴巴暑期实习的前端开发岗,在此表示感谢。
接着3月1号收到了内推的通知邮件,完善信息后很快就接到了一面的电话(3月3号)。
一面
面试了大概20分钟左右,整体内容还是比较偏基础。一开始是正常流程的自我介绍,说是三分钟自我介绍,但是我语速比较快的不到两分钟的介绍完了。(刚好是临近中午,原本打算吃饭的,要是去吃饭的话就得在路上面了...)
CSS 垂直居中
这个写过一篇博文专门总结过,不过面试的时候还是太过紧张没有答全。主要是 Flexbox 布局的垂直居中比较容易忘记。
具体就不再啰嗦了,详情可以查看:CSS 实现垂直居中
call 与 apply 的区别,以及性能差别
call 与 apply 的区别,这是一个老生常谈的面试题了。call() 与 apply() 都是用于在指定 this 值与参数的情况下调用函数,主要的区别在于除了传入 this 值之外,apply() 接收类数组或者类数组对象来作为调用的函数的参数,而 call() 则是需要分别传入函数的每一个参数(除第一个参数之外的其他参数)。
call()方法与apply()方法的作用相同,它们的区别仅在于接收参数的方式不同。对于call()方法而言,第一个参数是this值没有变化,变化的是其余参数都直接传递给函数。换句话说,在使用call()方法时,传递给函数的参数必须逐个列举出来。—— 『JavaScript 高级程序设计』
区别的话基本上只要看过书或者刷过面试题都会知道,但 call() 与 apply() 之间的性能差别就不是那么常见了。
比较幸运的是,之前在阅读 underscore 源码的时候有注意到这个细节,为此也写过另外的文章:从 optimizeCb 说起。
实践证明,在知道调用函数的参数数量时,使用 call() 的性能会优于 apply()。主要在实现的过程中 apply() 需要完成额外的操作(判断第二个参数类数组的长度,etc.)。具体为什么有这种差别,可以在 ECMAScript Language Specification 中查看 Function.prototype.apply与 Function.prototype.call 的具体实现差异。
参考链接
-
javascript - What is the difference between call and apply? - Stack Overflow
-
javascript - Why is call so much faster than apply? - Stack Overflow
什么是闭包
又是一个老生常谈的问题。我的理解比较肤浅,就是 A 函数返回 B 函数,B 函数能够访问 A 函数中的局部变量,使得在 A 外部的作用域中能够使用 B 函数间接操作 A 函数中的局部变量,这样就形成了一个闭包。A 函数中的局部变量与返回的 B 函数一同存在,不会被垃圾回收机制清理(引用还存在)。
在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。—— 维基百科
建议阅读 『你不知道的 JavaScript(上卷)』 中有关作用域与闭包的部分。
什么是尾递归
在计算机科学里,尾调用是指一个函数里的最后一个动作是一个函数调用的情形:即这个调用的返回值直接被当前函数返回的情形。这种情形下称该调用位置为尾位置。若这个函数在尾位置调用本身(或是一个尾调用本身的其他函数等等),则称这种情况为尾递归,是递归的一种特殊情形。—— 维基百科
一般递归实现阶乘:
function fact(n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * fact(n - 1);
}
}
一般递归需要中栈上维护函数的调用信息直到函数返回后才释放,容易发生『栈溢出』错误。但对于尾递归来说,只需要维护一个调用记录。
尾递归实现阶乘:
function fact(n) {
return fact-iter(n, 1);
}
function fact-iter(n, a) {
if (n == 0) {
return 1;
} else if (n == 1) {
return a;
} else {
return fact-iter(n - 1, n * a);
}
}
关于递归与尾递归,在 『计算机程序的构造和解释』中也有类似的讨论。
React 的设计理念
这部分答得不是很好,只提到了组件化,单向数据流,Virtual DOM 之类的。
有关 React 的设计思想可以参考这一篇文章:React 设计思想。
前端安全(攻击方式与如何防范)
第一反应就是 XSS 与 CSRF,XSS 可以通过对输入数据进行转义来防范,而 CSRF 则通过使用 SSL 链接访问资源或者请求中添加验证码来进行防范。
除此之外我漏掉了网络劫持,控制台注入代码等攻击方式,这里有篇文章做了详细介绍:聊一聊WEB前端安全那些事儿。
二面
第一次远程视频面试,好紧张。
一开始问了 CSS 中 position 属性的 absolute 的作用以及应用场景,这个基本上没有什么问题。接着叫我拿纸写冒泡排序(手写 T-T),飞快的写完。然后跟一面一样也问了前端安全相关的问题,一下子都不紧张了.. 没有想象中的难。
实现 bind 函数
同样是让我写代码,同样是手写(T-T)。这个问题对我来说不算难,不过只是写了简单的实现,没有考虑其他情况。
Function.prototype.bind = Function.prototype.bind || function (context) {
var self = this;
return function () {
return self.apply(context, arguments);
}
}
基本原理就是使用 apply() 与闭包,返回包含 apply() 的闭包使得 apply() 绑定指定作用域,但并未执行。
阅读 Underscore 源码的经历
之前拖拖拉拉的阅读完了 Underscore 的源码,并提交了一个小 Pull Request。
在阅读的过程中学到了许多的东西,例如上面提到的 call 与 apply 的性能差别,除此之外还有如何去判断变量的类型,以及如何判断两个变量是否相等,等等。另外也了解到许多闭包的使用场景。
阅读其他类库的收获
除了 Underscore 之外还阅读过一点 Bootstrap 和 jQuery,这个博客主题的样式部分的组织方式就是参考了 Bootstrap 的组织方式,另外也稍微阅读过 jQuery中 $.ajax 以及事件相关的源码。
在阅读代码的过程中的收获就是学习了一些组织代码的方式,还有如何写才能有利于拓展,更加健壮。其中也学到了一些提高性能的技巧,函数缓存,事件队列之类的。
博客主题的开发经历
其实一开始写主题只是想给自己用,之后发现蛮多人也喜欢我这个主题的,并时不时有人中 Github 上提 Issue,这对我是莫大的鼓励。虽然我水平并不是很高,但是写出来的东西有人用感觉真的是特别开心,也特别有动力去改进。
从开始去写主题到现在差不多也一年了,这一年中我从前端小白变成前端大白。在维护的过程中学习到很多东西,虽然目前写得也不是很好,但是我还是会慢慢改进继续维护下去的。
维护的过程中的收获就是,当站在自己的角度看问题与在别人的角度看完全是不一样的,或许有个功能我并不需要,但是有人提了,我就得站在『用户』的角度去思考,去实现。『用户』只关心能不能用,好不好用,而并不关心代码写得怎么样。
实习期间遇到得难题
可能我做的工作相对简单,就算不会,基本上靠搜索引擎都能够解决。我觉得能用 Google 解决的问题不算难题。以我现在的水平,还达不到遇到的难题 Google 搜索不到的😹
三面
三面基本上没有问太过具体的前端相关的问题,大部分是在聊聊看法,聊聊项目。
开始让我用纸画出博客的设计,其实主要还是主题,没什么难度,毕竟代码都是我自己写的。
然后让我介绍一下我熟悉的一个框架,说的 React,提及到了 Vitrual DOM 和 diff 算法,说了一下 diff 算法的大概策略。还有说到组件化,单向数据流等等。幸运的是,我在二面之前刷了 『深入 React 技术栈』这本书,结合之前的实践能够说个大概。
中间有聊到兴趣爱好,我想了想好像只有写代码。听歌应该也算?写代码的时候必定要听歌。我记得去年国庆有一天从起床写到晚上睡觉,差不多写了 11 个小时,那时候正在折腾 React 与 Meteor。我自己都觉得不可思议。
总结
可能是运气问题,我觉得我的这几面难度都不高😹。得益于看的书,好多知识点都是书上有的。基本上基础的前端面试题都可以在红宝书上找到,真不愧为前端面试宝典。另外 Github 上的这个博客主题也帮了很大的忙,300+ star 果然还是有点用处的(虽然说 star 不能代表什么,而且的确写得也很水,但作用不可否认)。
最后,基础很重要,基础扎实是基本。但是如果想要有突出的表现还是需要更有深度的研究。需要经常思考总结,不仅仅是浮于表面,更要深入原理。