滴滴实习内推面经(已挂)

326 阅读4分钟

这是我第一次面试,说实话,能过一面我都觉得很惭愧,因为问的问题很简单但我回答的很糟糕。还是面经那些背的太少了,面试前看的都不考,有高考那味了(狗头)。但是面试官真的人超好,还多次引导我的思路。

一面:

1. 介绍自己

2. 你做过那么多项目,说一个令你印象最深的项目

多亏了项目有一些亮点,才能通过一面。

3. 说一说你对闭包的理解

这种常用的题考前应该多理解一下的。推荐一篇文章.

MDN 对闭包的定义为:
闭包是指那些能够访问自由变量的函数。
那什么是自由变量呢?
自由变量是指在函数中使用的,但既不是函数参数也不是函数的局部变量的变量。
由此,我们可以看出闭包共有两部分组成:
闭包 = 函数 + 函数能够访问的自由变量

某种意义上来说,所有js函数都是闭包.

我们经常举一个例子:

function get() {
    var a = 1;
    retrun function() {
        console.log(a)
    }
}

let temp = get();
temp();

其中,a是局部变量,即便在执行上下文已经销毁的情况下依然可以通过作用域链得到a的值从而在外部使用。

所以,让我们再看一遍实践角度上闭包的定义:

  1. 即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回)

  2. 在代码中引用了自由变量

4. 说一下for(var i = 0; i < 3; i++) {setTimeout(() => {console.log(i)}, 0)}的运行结果

答案:333

问如果正常输出的话怎么改:var改成let

这个不用多说,常考题目。考点也是var的缺陷。

顺便多说一句,下面这段代码输出也都是3。

var data = [];

for (var i = 0; i < 3; i++) {
  data[i] = function () {
    console.log(i);
  };
}

data[0]();
data[1]();
data[2]();

除了修改成let的方法,还可以使用闭包。

var data = [];for (var i = 0; i < 3; i++) {    data[i] = (function (i) {        return function () {            console.log(i);        }    })(i);}data[0]();data[1]();data[2]();

5. 列一下常用的array内置方法,哪些有返回值(其实是考push的返回值)

push的返回值是现在数组的长度。

6. 说一下常用的http状态码,有用到过304嘛,说说你对缓存的理解,说说常用的协商缓存请求头。

状态码我当时只背出了常用的,还是太嫩了。

这里附上链接 www.runoob.com/http/http-s…

304状态码是直接使用了浏览器协商缓存(我的理解),缓存分为强缓存和协商缓存。强缓存就是在请求资源时不询问服务器就直接使用,而协商缓存就是先询问服务器是否有更新,没有更新再使用本地缓存。

强缓存与协商缓存的区别,可以用下表来进行描述:

获取资源形式

状态码

发送请求到服务器

强缓存

从缓存取

200(from cache)

否,直接从缓存取

协商缓存

从缓存取

304(not modified)

是,正如其名,通过服务器来告知缓存是否可用

强缓存相关字段有expires,cache-control。如果cache-control与expires同时存在的话,cache-control的优先级高于expires。

协商缓存相关字段有Last-Modified/If-Modified-Since,Etag/If-None-Match

附:etag的作用:

  • 一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;

  • 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);

  • 某些服务器不能精确的得到文件的最后修改时间。

这时,利用Etag能够更加准确的控制缓存,因为Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符。

Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

未完待续...