这天参加了两个面试 上午在大新 下午在下沙 上午的面试收获要比下午多多了
先Mark上午面试的总结(这里只总结自己没回答好或者没回答上)

ES6新增的箭头函数 作用是什么?和ES5相比 好处在哪

回答这个问题之前,首先来看看这个问题:

JS中this到底指向什么?

这是个老生常谈的问题了,网上一堆大牛给出了答案,概括来说分4中情况:

this作为对象方法调用、作为函数调用、作为构造函数调用、apply或call调用。

具体答案依然一搜一大堆,篇幅问题,且这里讲的是箭头函数,所以以 this作为函数调用 这一问题来分析

this作为函数被调用时

函数也可以直接被调用,这个时候this被绑定到了全局对象。

1
2
3
4
5
6
ar x = 1;
 function test(){
   this.x = 0;
 }
 test();
 alert(x); //this作为函数直接调用了!这里是语法糖有简写 输出为0

但这样就会出现一些问题,就是在函数内部定义的函数,其this也会指向全局,而和我们希望的恰恰相反。代码如下:

1
2
3
4
5
6
7
8
9
10
11
var o = {
x : 1,
func : function() { console.log(this.x) },
test : function() {
setTimeout(function() {
this.func();
}, 100);
}
};
o.test(); // TypeError : this.func is not a function

上面的代码会出现错误,因为this的指向从o变为了全局(函数调用中的this都是指向全局的)。我们需要修改上面的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
var o = {
x : 1,
func : function() { console.log(this.x) },
test : function() {
var _this = this;
setTimeout(function() {
_this.func();
}, 100);
}
};
o.test();

通过使用外部事先保存的this就行了

(其实这个所谓的外部保存this就是第一种情况: this作为对象被调用,此时的this,就是指向o对象!)。

这里就可以利用到箭头函数了,我们刚才说过,

箭头函数的 this 始终指向函数定义时的 this,而非执行时

也就是说,用了箭头函数,就省掉了用一个新的that去存外部this的指向了

1
2
3
4
5
6
7
8
9
var o = {
x : 1,
func : function() { console.log(this.x) },
test : function() {
setTimeout(() => { this.func() }, 100);
}
};
o.test();

PS: 测试表明,使用箭头函数,除了写法优雅以外,从性能上已经确定箭头函数比bind()快了

什么是CDN(问题:加快网页加载速度手段)

CDN的全称是Content Delivery Network,即内容分发网络。

内容包括但不限于什么什么分布式存储、负载均衡、网络请求的重定向和内容管理4个技术性名词

总的来说就是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。解决网络拥挤的状况,提高用户访问网站的响应速度。

下面这则漫画简要的描述了CDN为何物和其作用:

http://xiaoheiyang.baijia.baidu.com/article/126615

DNS

为什么需要DNS解析域名为IP地址?

网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“202.96.134.133”之类的IP地址,而不能认识域名。我们无法记住10个以上IP地址的网站,所以我们访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需要的页面,这是因为有一个叫“DNS服务器”的计算机自动把我们的域名“翻译”成了相应的IP地址,然后调出IP地址所对应的网页。

什么是DNS?

DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。

DNS过程

DNS是应用层协议,事实上他是为其他应用层协议工作的,包括不限于HTTP和SMTP以及FTP,用于将用户提供的主机名解析为ip地址。

DNS 查询的过程如下图所示

1、在浏览器中输入www . qq .com 域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。

2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。

3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

4、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。

5、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(http://qq.com) 给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找 http://qq.com 域服务器,重复上面的动作,进行查询,直至找到 www . qq .com 主机。

6、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

详见: https://www.zhihu.com/question/23042131

关于TCP/IP 四层协议

其实了解过后发现,想要理解DNS,其实也离不开TCP/IP。HTTP协议就属于TCP/IP协议家族中的一员,前端经常要接触HTTP,自然很有必要理解一下什么是TCP/IP

什么是TCP/IP

两台机器之间该如何通信,就需要制定各种各样的协议了。例如:文件传输适用TCP协议。域名系统适用DNS协议。有了些协议的存在,各种数据流按照规则传输,计算机之间得以通信。

TCP/IP协议是一个协议集合。统称为TCP/IP。TCP/IP协议族中有一个重要的概念是分层,TCP/IP协议按照层次分为以下四层。应用层、传输层、网络层、数据链路层。

HTTP 关系密切的协议 : IP、TCP 和 DNS

IP协议:IP(Internet protocol),这里的IP不是值得我们通常所说的192.168.1.1.这个IP指的是一种协议,而后面的数字值得是IP地址。IP协议的作用在于把各种数据包准确无误的传递给对方,其中两个重要的条件是IP地址,和MAC地址(Media Access Control Address)。由于IP地址是稀有资源,不可能每个人都拥有一个IP地址,所以我们通常的IP地址是路由器给我们生成的IP地址,路由器里面会记录我们的MAC地址。而MAC地址是全球唯一的,除去人为因素外不可能重复。举一个现实生活中的例子,IP地址就如同是我们居住小区的地址,而MAC地址就是我们住的那栋楼那个房间那个人。

TCP协议:如果说IP协议是找到对方的详细地址。那么TCP协议就是把安全的把东西带给对方。各有分工,互不冲突。

按层次分,TCP属于传输层,提供可靠的字节流服务。什么叫字节流服务呢?所谓的字节流,其实就类似于信息切割。比如你是一个卖自行车的,你要去送货。安装好的自行车,太过庞大,又不稳定,容易损伤。不如直接把自行车拆开来,每个零件上都贴上收货人的姓名。最后送到后按照把属于同一个人的自行车再组装起来,这个拆解、运输、拼装的过程其实就是TCP字节流的过程。

为了确保信息能够确保准确无误的到达,TCP采用了著名的三次握手策略(three-way handshaking)

访问一个网站,从输入url到最终打开成功经历的http流程

(面试时回答得不好,下图解释得再清楚不过了)

详情: http://www.cnblogs.com/roverliang/p/5176456.html

CSS选择器以及预处理的作用

篇幅太多,另起了一篇post,顺便简单列举和总结常用的一些选择器: https://silkyer.github.io/2017/05/18/CSS-selector/

面试时没回答上,其实大部分都用过,但是用的次数太少,很多选择器是用过一次,实现了功能后,就很少机会试用第二次了.时间一长就忘记了,通过这次面试让我意识到前端不仅仅是JS,HTML和CSS还有其他相关的很多基础知识也很重要的

关于5.17号上午的面试

在大新地铁站附近,环境很好.重点是,我最最在意的面试环节,其中太多细节感动到泪流满面:

1、这家公司是我见过的唯一一家提前打印好简历的,并且面试官会很详细的聊你的简历、在你的简历上做笔记,自己的简历被认真对待是一件很窝心的事情。如果能跟这样的面试官一起共事,先不说技术,就这种认真的态度也对自己受益终生

2、面试时人事旁听,在我和技术面试的过程中,人事在旁边观察也算是一种考核,也省去了双方的再一次人事面试,足以证明他们对应聘者的重视程度。

3、面试官提问很有技巧,问题面面俱到,能根据我的回答抓住我擅长的领域,并深挖下去,这样给我感觉是能挖掘出应聘者的潜力

4、如果您能看到,真的很感谢您在面试过程中对我耐心地解答我的疑虑。

再就是自己的不足了吧,除了上述的问题总结,在沟通过程中,由于自己面试失败次数太多,心态崩了,各种出糗。给人一种毛躁的印象。下一次面试的话,调整好自己的心态吧,命里无时莫强求。

总结

这次的面试是我收获最大的一次面试,让我理解到,既然已经从事了IT这个行业,就势必要去了解下网络底层,虽然实际工作中这些东西用不到。高楼大厦,起于平川。不积跬步,无以至千里,不积小流,无以成江海。我现在的知识结构,就如同空中楼阁。稍微遇到高层次的问题,可能就理解不了了。一棵大树如果不在刚开始的时候深深的扎根,把所有的力量用到生长叶子开花上面。等到了大风来袭,互联网低潮的时候,一切来自不易的生活,就轻而易举的被倾覆。

理想是成为一个拥有渊博知识的人,拥有丰富的专业知识,足以应对工作中的难题。工作之余,博览群书,提升气质谈吐。