2019腾讯暑期实习面试(offer)前端
最近在忙着准备找实习,所以没有更新之前的文章.
不过所幸功夫不负有心人,我拿到了腾讯的offer.
这里分享一下面试的经验.
简介
本人双非本科,普通学生一枚.
面的是腾讯的Web前端开发.
整个面试一共有四轮,分为:一面(笔试\初试) 二面(技术\复试) 三面(项目\复试) 四面(HR\终面)
一面
我是在五月份的时候收到的初试的消息
第一面的形式是远程视频面试,在牛客网上进行.
面试首先肯定是一个自我介绍,这里我就不赘述了
聊了一下我的大概情况过后,然后就开始面试了
第一个问题:
怎么判断一个对象是不是数组?
- 首先可以用 ES5 提供的 isArray 方法进行判断,这个方法应该是最官方的
- 可以使用 instanceof Array 来判断,不过这种方式存在问题,比如当存在多个全局对象(如使用ifream),那么这个窗口的Array对象对另一个窗口使用 instanceof 就会判断失败
- 这里是我当时给的答案(在JS高级编程一书中有),通过 toString 来进行判断
function isArray(value){
return Object.prototype.toString.call(value) === "[object Array]";
}
第二个问题:
了解深拷贝与浅拷贝吗?你能实现一下深拷贝吗?
这个问题首先我们要知道深拷贝浅拷贝的区别,我们知道JS的值分为基础类型和引用类型,也就是说在进行赋值操作时引用类型赋值的实际上只是将地址进行赋值
也就是两个变量指向了同一个地址,浅拷贝呢就是正常的赋值操作,而深拷贝则希望是一个新的独立的值,而不是仅仅拷贝地址
由此我们可以给出以下拷贝函数(这里给的代码只是一个示意,并不是最佳实践)
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
//判断ojb子元素是否为对象,如果是,递归复制
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
第三个问题:
知道继承吗?实现一下?
这里的话我问了一下面试官,使用ES6的class实现,还是使用原生JS实现?
面试官说都可以,我就用的原生JS写的,用的组合继承的方式
function SuperType(){
this.property = true;
}
SuperType.prototype.getSuperValue = function(){
return this.property;
};
// 创建一个新的构造函数
function SubType(){
// 调用父类的构造函数
SuperType.applay(this,arguments);
this.subprototype = false;
}
// 重写这个构造函数的原型对象让其指向SuperType的实例
SubType.prototype = new SuperType();
// 修改 constructor 让其指向正确地构造函数
SubType.prototype.constructor = SubType;
// 添加这个新构造函数的自身的方法
SubtType.prototype.getSubValue = funtion(){
return this.subproperty;
}
var instance = new SubType();
alert(instance.getSuperValue()); // true 可以访问到原型对象上的方法和属性
到这里视频面试在线打代码的部分就完成了,后面就问了一些前端方面的问题
第四个问题:
你了解XSS和CSRF吗?
回答了解,之后就会详细问了.
首先XSS分为以下三种
- 反射型XSS: 在url上拼接攻击代码,访问get请求的接口,来注入XSS代码
- MXSS:DomXSS 在 dom 元素的 title , name 等属性注入
- 存储型XSS: 通过表单(一般是评论区等地方)提交XSS数据,等后台从数据库中读取返给前端页面时生效
CSRF的攻击方式则是,当用户登录过A网站通过A网站的合法性身份校验过后,B网站通过钓鱼链接等形式获取用户在A网站的合法身份来进行攻击
两者的区别:
最大的区别在于 CSRF 需要用户完成合法性验证后才能进行,而XSS则不需要
防御:
XSS的主要防御手段是通过前后端的数据过滤来实现,对一些HTML的特殊字符进行转义
CSRF的主要防御手段则是通过使用token验证来验证用户身份的合法性
一面的主要内容就是上述几个问题,整个过程45分钟,我在打代码的时候当时有个逻辑写反了,找了很久都没有找到问题,最后是被面试官指出了,所以在面试官那落了个马虎大意的不良印象.
不过最后还是顺利通过了初试.在第二天的晚上面试状态就变为了复试.
二面
在面试状态变更后的一个礼拜后预约了复试的时间(因为中间过了个端午)
同样的首先是自我介绍,然后就进入正题.
第一个问题:
浏览器输入网址后到页面显示的整个过程?
- DNS解析

- TCP连接建立(三次握手,四次挥手)

- 加载文件(HTML,JS,CSS)
- 渲染页面(生成DOMtree,CSSrule,结合成render tree ,页面布局,元素绘制)
第二个问题:
HTTPS和HTTP的区别?采用的加密算法?
http使用明文传输,https采用加密方式传输
具体加密过程如下:
- 客户端向服务器发起HTTPS请求,连接到服务器的443端口(默认)
- 服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人
- 服务器将自己的公钥发送给客户端,客户端收到服务器端的公钥之后,会对公钥进行检查,验证其合法性,如果发现发现公钥有问题,那么HTTPS传输就无法继续。严格的说,这里应该是验证服务器发送的数字证书的合法性,关于客户端如何验证数字证书的合法性。如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,这样在概念上和服务器端的密钥容易进行区分。然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束
- 客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器
- 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文
- 然后服务器将加密后的密文发送给客户端
- 客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成
对称加密:DES
非对称加密:RSA
第三个问题:
cookie的作用?cookie的安全?cookie与webstorage的区别?
cookie的作用:
cookie可以跟踪会话,弥补HTTP无状态协议的不足
判断用户是否登陆过网站,以便下次登录时能够实现自动登录(或者记住密码)。如果我们删除cookie,则每次登录必须从新填写登录的相关信息
保存上次登录的时间等信息
这里面试官就问我,使用Cookie来做状态保持是否安全?怎么解决?
首先Cookie是不安全的,可以通过脚本获取,也能被中间人截取
解决方案:
- Cookie内容加密
- 设置HttpOnly头(无法使用JS获取Cookie)
- Secure:true (只有在HTTPS时才发送Cookie)
- 设置过期时间
Cookie与Webstorage (H5提出的用于替代Cookie的解决方案)的区别:
- 生命周期:localStorage:localStorage的生命周期是永久的,关闭页面或浏览器之后localStorage中的数据也不会消失。localStorage除非主动删除数据,否则数据永远不会消失。 sessionStorage的生命周期是在仅在当前会话下有效。sessionStorage引入了一个“浏览器窗口”的概念,sessionStorage是在同源的窗口中始终存在的数据。只要这个浏览器窗口没有关闭,即使刷新页面或者进入同源另一个页面,数据依然存在。但是sessionStorage在关闭了浏览器窗口后就会被销毁。同时独立的打开同一个窗口同一个页面,sessionStorage也是不一样的
存储大小:localStorage和sessionStorage的存储数据大小一般都是:5MB
存储位置:localStorage和sessionStorage都保存在客户端,不与服务器进行交互通信
存储内容类型:localStorage和sessionStorage只能存储字符串类型,对于复杂的对象可以使用ECMAScript提供的JSON对象的stringify和parse来处理
应用场景:localStoragese:常用于长期登录(+判断用户是否已登录),适合长期保存在本地的数据。sessionStorage:敏感账号一次性登录
相比Cookie的优点:
存储空间更大:cookie为4KB,而WebStorage是5MB
节省网络流量:WebStorage不会传送到服务器,存储在本地的数据可以直接获取,也不会像cookie一样每次请求都会传送到服务器,所以减少了客户端和服务器端的交互,节省了网络流量
快速显示:有的数据存储在WebStorage上,再加上浏览器本身的缓存。获取数据时可以从本地获取会比从服务器端获取快得多,所以速度更快
安全性:WebStorage不会随着HTTP header发送到服务器端,所以安全性相对于cookie来说比较高一些,不会担心截获,但是仍然存在伪造问题
WebStorage提供了一些方法,数据操作比cookie方便
第四个问题:
前端性能优化的手段?
网络加载
减少HTTP资源请求数: 合并静态资源,构建工具合并雪碧图\避免重复资源
减少HTTP请求大小: 对文件进行压缩优化,使用gzip传输压缩内容\移除代码注释压缩代码
将CSS,JS放到外部文件:HTML引用外部资源可以有效利用浏览器静态资源缓存
避免空的 href 和 src
指定Cache-Control 或 Expires
合理设置 Etag 和 Last-Modified
减少页面重定向
静态资源分域存放增加下载并行数
静态资源CDN来存储文件
CDN Combo 下载传输内容
缓存Ajax cache属性设置为 true
使用Get Ajax的速度比POST请求快
减少Cookie大小进行Cookie隔离(分域存放静态资源)
异步JS
避免CSS import 加载CSS
页面渲染
CSS资源放到页面顶部
JS放到页面底部
不在HTML中缩放图片
减少DOM元素数量和深度
避免使用
<table><ifream>等慢元素,这些元素会整个渲染完成后再绘制到页面上避免使用CSS表达式或CSS滤镜
第五个问题:
前端性能检测?
Performance Timing API\ 浏览器Profile工具\ 页面埋点\ 资源加载时序图 用于获取页面加载的性能
如果是远程监控用户的页面性能则需要将相关数据上传到服务器存储
第六个问题:
你了解算法吗?
我:了解一点
你知道堆排序和快排的区别吗?
我:数据结构不同,堆排是一种树状结构,时间复杂度都是(nlogn最好)
他们的时间复杂度一样,为什么平常更多使用快排,而不是堆排?
堆排的时间常量要大于快排,也就是执行交换操作的性能不同,在性能上快排的性能略优于堆排,并且使用场景中快排效率最坏的情况的概率比较小
快排:数组中交换数据,在数据量不是特别大,而且离散程度较高的情况下效率很高
堆排序:创建堆,数据交换,调整堆的时间均很多
所以在实际应用中,我们用快排会更多一点
平时学习的方式?
我:前端掘金社区, github , infoq, 博客, 书籍
大概多长时间看完一本书?
我:第一遍通看一个星期,完全掌握差不多要一个多月.
有没有对书上的内容进行实践?
我:能够实践的部分会做一些demo,不好实践的部分则会分享一些自己的学习笔记在博客上
你的博客在外网能够访问吗?
我:可以,然后给了链接
然后二面的内容就差不多了,期间问了一些简历上的项目,这里因人而异所以我就不再多说了,整个过程大概65分钟.
这里到三面有一个小插曲,我看见我官网上的面试流程变灰了,我以为挂掉了,还郁闷了几天
不过三天后告诉我约了下一场面试.
三面
首先仍是万年不变的自我介绍:
然后面试官问了:
- 你觉得简历的哪个项目对你来说最有挑战性?
- 中间遇到什么困难?
- 你是怎么解决的?
- 如果让你继续开发你觉得有什么改进的?
- 你觉得你的项目市场前景如何?
- 你在项目中负责的工作?
- 你是怎么做的?
- 你的职业规划?
- 你的目标?
- 你最近在看什么书?
- 你看过的书中哪一本对你影响最大?为什么?
这一面主要就是问你简历的项目了,回答项目的时候从
- 背景
- 目标
- 行动
- 结果
的顺序来答就好,至于其它的问题就只能看你自己的临场发挥了
在两天的焦急等待后,收到了HR面的通知
终面
终面的HR是个女HR,我之前一度以为我去的部门只有汉子
简单的自我介绍过后就开始聊人生
问题:
- 你为什么要来实习?
- 你大学参加的这么多比赛里面哪一个让你印象深刻?为什么?
- 你是怎么改进的?
- 你有没有面试其他的互联网公司?
- 你为什么选择要来面腾讯?
HR面的话,问题就和技术没啥关系了,感觉主要考察的就是你的意愿强不强烈
你的为人处世,性格等方面
我当时对于这些问题,就一直表示十分希望能够进入腾讯
如果看过我早期的文章的同学,应该知道我在去年就投过腾讯的实习,然后在一面就光荣的挂掉了
所以在HR问我最后问题的时候我的原话是这样的:
"我十分希望能够进入腾讯,您那边可能也知道我在去年就投过咱们公司,当时确实是因为自己的能力达不到咱们公司的要求,不过这一年我一直都在努力提升自己,这次面试才走到了现在,就算这次我或许没有达到要求,没有机会到咱们公司实习,但是我认为只要我一直努力早晚能够达到咱们公司的要求."
到这里HR就笑了,说她没有什么问题要问我的了,offer的话后面有人会联系你.
我当时都惊了,我看其它大佬的面经的时候都是回去等通知,没有直接说offer的事情的.
我也不知道,在面试中我哪一点吸引了面试官,不过最终还是如愿以偿地拿到了offer
结语
这里的话我想说,面试的话很多时候最后我们都可能拿不到我们心仪的offer,面试确实是一个比较看运气的事情
就算面试结果不太理想,但这确实是一个发现自己不足的很好的机会.
我从今年的3月开始准备面试,期间面了 阿里,京东,字节跳动,美团,腾讯(offer之前面的一次腾讯三面被刷)
就通过这些面试找到自己知识点的不足,然后面完过后就去查,弥补这些不足,最后终于如愿.
感谢昨天的自己的努力,不忘初心,方得始终.
希望大家都能拿到自己心仪公司的offer.
2019腾讯暑期实习面试(offer)前端的更多相关文章
- 我的阿里、腾讯暑期实习Offer经历
三四月份对我拿来说是个忙碌的两个月,实验室项目到了关键的时刻,自己又需要抽身去找暑期实习,总之过得很快.值得欣慰的是幸运的拿到了阿里和腾讯的暑期实习offer,也算是对三四月份的忙碌一些回报吧.阿里的 ...
- 杂记:腾讯暑期实习 Web 后端开发面试经历
今天面试(一面)腾讯暑期实习 Web 后端开发,一言难尽. 第一部分,常规的自我介绍. 介绍完,面试官问我对人工智能有什么理解?深度学习和机器学习的区别?对调参有什么见解?语音识别中怎样运用了机器学习 ...
- 2016/4/14腾讯Android实习面试
腾讯实习面试,面试官会先问你会什么,擅长什么.然后会依照这个问,问的也不是非常偏,问道你不会的就换下一个知识点. 主要问我的有这几个问题 图形学 1.Bizer曲线怎么绘制的.原理是什么 2.对栅格有 ...
- 记拿到鹅厂前端开发暑期实习offer的经历
#想起来时的路 在真正拿到腾讯实习offer之前,也是看过不少人的面经,心生向往.很早在入前端坑之前,我就想着大四的时候有机会要尝试去腾讯里实习. 大一入门语言就是C++,这让我很无奈,所以我很快的就 ...
- 化学专业大二转战Android开发,终于拥有了鹅厂暑期实习offer
我是双非学校,应用化学专业,一年前我大二,现在我大三.一年前我两手空空,现在我拥有了鹅厂暑期实习的offer. 虽然结果是好的,但我春招实习的道路远没有这么简单和辉煌,它是无比坎坷的:每个人应该量力而 ...
- 2015腾讯暑期实习生 Web前端开发 面试经历
[2015腾讯暑期实习生 Web前端开发 面试经历] 好吧,首先声明,我被刷了,应该是跪在二面 微信查到的面试状态一直呈现复试中 .. 整整四天了.. 看来是没希望了 不过也是一次经历,记录一下还是可 ...
- 你不知道的腾讯社招面试经验(已offer)
# 你不知道的腾讯社招面试经验(已offer) ## 背景 最近一段时间换工作,成功获得了腾讯的offer.在这里有点经验跟大家分享,我觉得,比起具体的面试题,有些东西更加重要,你知道这些东西,再去准 ...
- 腾讯2016实习生面试经验(已经拿到offer)
忐忑了好几天,今天最终收到深圳总部的电话.允许录用我为2016年实习生,感觉整个天空都放晴了.坐标:武汉大学,给大家说说我的面试经历吧,我投的是软件开发--应用开发方向. 一.校招流程 投递简历- ...
- 2019 讯飞java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.讯飞等公司offer,岗位是Java后端开发,因为发展原因最终选择去了讯飞,入职一年时间了,也成为了面试官,之 ...
随机推荐
- Spring @Autowired使用介绍
参考博客: https://blog.csdn.net/u013412772/article/details/73741710 引用文章地址: https://my.oschina.net/Helio ...
- 杭电acm刷题顺序
最近兴趣来了,闲暇之余,回顾大学期间刷过的杭电acm那些入门级别的题,以此巩固基础知识! 以下参考刷题顺序,避免入坑 原文传送门:https://blog.csdn.net/liuqiyao_01/a ...
- sublime相关小技巧
1.快速建立一个新文件:Ctrl+n 2.修改多个相同符号:Ctrl+D 3.建立语言后缀的文件保存,例如我想创建PHP的语言脚本,先按Ctrl+Shift+p,打开Command Palette,输 ...
- 多进程——waitpid()函数的小例子
本例中使用fork()创建一个子进程,然后让子进程暂停5s,接下来对原有的父进程使用waitpid()函数,利用WNOHANG使父进程不会阻塞每隔一秒判断子进程是否退出. #include" ...
- Aizu 2456 Usoperanto (贪心)
贪心,对于一个修饰关系可以连一条有向边,在合并的时候,子节点的序列一定是连续安排的,因为如果有交叉,交换以后一定更优. 然后一个序列一个序列的考虑,长度短的应该在前面,否则同样交换以后更优.因此排序以 ...
- 【CF799B】T-shirt buying(一道很水的小根堆)
点此看题面 大致题意: 有\(n\)件T恤衫,告诉你每件T恤衫的价格以及它正面和反面的颜色(\(1≤\)颜色的编号\(≤3\)),现在有m个顾客,已知每个人想要的衣服的颜色(一件T恤衫只要有一面的颜色 ...
- fold - 折叠输入行, 使其适合指定的宽度
总览 (SYNOPSIS) ../src/fold [OPTION]... [FILE]... 描述 (DESCRIPTION) 折叠(wrap) 每个 文件 FILE 中 的 输入行 (缺省为 标准 ...
- python_27_多级字典嵌套及操作
#key-value 字典无下标 所以乱序,key值尽量不要取中文 person_log={ '大二':{ 'Ya Nan':['free','cute','soso'], 'Sha sha':['微 ...
- 漫谈 Clustering (番外篇): Vector Quantization
在接下去说其他的聚类算法之前,让我们先插进来说一说一个有点跑题的东西:Vector Quantization.这项技术广泛地用在信号处理以及数据压缩等领域.事实上,在 JPEG 和 MPEG-4 等多 ...
- 通过cmd查看环境变量名对应的环境变量值
在VS环境中通常要添加路径,不过基本都是按照往上提供的方法添加变量名形如:$(VC_IncludePath),但是如何通过cmd命令找到真正的路径呢 未完待续……