2019腾讯暑期实习面试(offer)前端

最近在忙着准备找实习,所以没有更新之前的文章.

不过所幸功夫不负有心人,我拿到了腾讯的offer.

这里分享一下面试的经验.

 

简介

本人双非本科,普通学生一枚.

面的是腾讯的Web前端开发.

整个面试一共有四轮,分为:一面(笔试\初试)  二面(技术\复试) 三面(项目\复试) 四面(HR\终面)

 

一面

我是在五月份的时候收到的初试的消息

第一面的形式是远程视频面试,在牛客网上进行.

 

面试首先肯定是一个自我介绍,这里我就不赘述了

聊了一下我的大概情况过后,然后就开始面试了

 

第一个问题:

怎么判断一个对象是不是数组?

  1. 首先可以用 ES5 提供的 isArray 方法进行判断,这个方法应该是最官方的
  2. 可以使用 instanceof Array 来判断,不过这种方式存在问题,比如当存在多个全局对象(如使用ifream),那么这个窗口的Array对象对另一个窗口使用 instanceof 就会判断失败
  3. 这里是我当时给的答案(在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分为以下三种

  1. 反射型XSS: 在url上拼接攻击代码,访问get请求的接口,来注入XSS代码
  2. MXSS:DomXSS 在 dom 元素的 title , name 等属性注入
  3. 存储型XSS: 通过表单(一般是评论区等地方)提交XSS数据,等后台从数据库中读取返给前端页面时生效

CSRF的攻击方式则是,当用户登录过A网站通过A网站的合法性身份校验过后,B网站通过钓鱼链接等形式获取用户在A网站的合法身份来进行攻击

 

两者的区别:

最大的区别在于 CSRF 需要用户完成合法性验证后才能进行,而XSS则不需要

 

防御:

XSS的主要防御手段是通过前后端的数据过滤来实现,对一些HTML的特殊字符进行转义

CSRF的主要防御手段则是通过使用token验证来验证用户身份的合法性

 

一面的主要内容就是上述几个问题,整个过程45分钟,我在打代码的时候当时有个逻辑写反了,找了很久都没有找到问题,最后是被面试官指出了,所以在面试官那落了个马虎大意的不良印象.

不过最后还是顺利通过了初试.在第二天的晚上面试状态就变为了复试.

 

二面

在面试状态变更后的一个礼拜后预约了复试的时间(因为中间过了个端午)

同样的首先是自我介绍,然后就进入正题.

 

第一个问题:

浏览器输入网址后到页面显示的整个过程?

  1. DNS解析DNS解析
  2. TCP连接建立(三次握手,四次挥手)TCP连接
  3. 加载文件(HTML,JS,CSS)
  4. 渲染页面(生成DOMtree,CSSrule,结合成render tree ,页面布局,元素绘制)

 

第二个问题:

HTTPS和HTTP的区别?采用的加密算法?

 

http使用明文传输,https采用加密方式传输

具体加密过程如下:

  1. 客户端向服务器发起HTTPS请求,连接到服务器的443端口(默认)
  2. 服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人
  3. 服务器将自己的公钥发送给客户端,客户端收到服务器端的公钥之后,会对公钥进行检查,验证其合法性,如果发现发现公钥有问题,那么HTTPS传输就无法继续。严格的说,这里应该是验证服务器发送的数字证书的合法性,关于客户端如何验证数字证书的合法性。如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,这样在概念上和服务器端的密钥容易进行区分。然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束
  4. 客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器
  5. 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文
  6. 然后服务器将加密后的密文发送给客户端
  7. 客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成

 

对称加密:DES

非对称加密:RSA

 

第三个问题:

cookie的作用?cookie的安全?cookie与webstorage的区别?

 

cookie的作用:

cookie可以跟踪会话,弥补HTTP无状态协议的不足

  • 判断用户是否登陆过网站,以便下次登录时能够实现自动登录(或者记住密码)。如果我们删除cookie,则每次登录必须从新填写登录的相关信息

  • 保存上次登录的时间等信息

这里面试官就问我,使用Cookie来做状态保持是否安全?怎么解决?

 

首先Cookie是不安全的,可以通过脚本获取,也能被中间人截取

解决方案:

  1. Cookie内容加密
  2. 设置HttpOnly头(无法使用JS获取Cookie)
  3. Secure:true (只有在HTTPS时才发送Cookie)
  4. 设置过期时间

 

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分钟.

这里到三面有一个小插曲,我看见我官网上的面试流程变灰了,我以为挂掉了,还郁闷了几天

不过三天后告诉我约了下一场面试.

 

三面

首先仍是万年不变的自我介绍:

然后面试官问了:

  1. 你觉得简历的哪个项目对你来说最有挑战性?
  2. 中间遇到什么困难?
  3. 你是怎么解决的?
  4. 如果让你继续开发你觉得有什么改进的?
  5. 你觉得你的项目市场前景如何?
  6. 你在项目中负责的工作?
  7. 你是怎么做的?
  8. 你的职业规划?
  9. 你的目标?
  10. 你最近在看什么书?
  11. 你看过的书中哪一本对你影响最大?为什么?

 

这一面主要就是问你简历的项目了,回答项目的时候从 

  1. 背景
  2. 目标
  3. 行动
  4. 结果

的顺序来答就好,至于其它的问题就只能看你自己的临场发挥了

 

在两天的焦急等待后,收到了HR面的通知

 

终面

终面的HR是个女HR,我之前一度以为我去的部门只有汉子

简单的自我介绍过后就开始聊人生

 

问题:

  1. 你为什么要来实习?
  2. 你大学参加的这么多比赛里面哪一个让你印象深刻?为什么?
  3. 你是怎么改进的?
  4. 你有没有面试其他的互联网公司?
  5. 你为什么选择要来面腾讯?

 

HR面的话,问题就和技术没啥关系了,感觉主要考察的就是你的意愿强不强烈

你的为人处世,性格等方面

我当时对于这些问题,就一直表示十分希望能够进入腾讯

如果看过我早期的文章的同学,应该知道我在去年就投过腾讯的实习,然后在一面就光荣的挂掉了

所以在HR问我最后问题的时候我的原话是这样的:

"我十分希望能够进入腾讯,您那边可能也知道我在去年就投过咱们公司,当时确实是因为自己的能力达不到咱们公司的要求,不过这一年我一直都在努力提升自己,这次面试才走到了现在,就算这次我或许没有达到要求,没有机会到咱们公司实习,但是我认为只要我一直努力早晚能够达到咱们公司的要求."

 

到这里HR就笑了,说她没有什么问题要问我的了,offer的话后面有人会联系你.

 

我当时都惊了,我看其它大佬的面经的时候都是回去等通知,没有直接说offer的事情的.

我也不知道,在面试中我哪一点吸引了面试官,不过最终还是如愿以偿地拿到了offer

 

结语

这里的话我想说,面试的话很多时候最后我们都可能拿不到我们心仪的offer,面试确实是一个比较看运气的事情

就算面试结果不太理想,但这确实是一个发现自己不足的很好的机会.

我从今年的3月开始准备面试,期间面了 阿里,京东,字节跳动,美团,腾讯(offer之前面的一次腾讯三面被刷)

就通过这些面试找到自己知识点的不足,然后面完过后就去查,弥补这些不足,最后终于如愿.

 

感谢昨天的自己的努力,不忘初心,方得始终.

希望大家都能拿到自己心仪公司的offer.

 

    

   

 

posted @ 2019-06-19 13:35  巽秋  阅读(4186)  评论(9编辑  收藏  举报