Jason's

Sharing makes better.

Tencent Phone Interview III

清明时节雨纷纷呀,就在 4 月 4 号的 20:52,我接到一下陌生男子的电话由深圳打过来,没错,腾讯的三面

一开始的时候,面试官还是从简历着手

我看到你大一才开始学习的前端,当时为什么选择前端这个方向呢

主要还是讲了一下可以把自己想表达的东西用代码来实现,觉得很酷等等

你简历上并没有介绍你在学校的学习情况,不知道你的基础学科成绩怎么样

我在大一的时候拿了二等奖学金,但是在大二的时候,因为进入了工作室,可能把更多的精力放在了项目和前端这个方向上,而且对于类似马克思之类的高学分的却与专业知识没有太大关系的科目不怎么感兴趣,所以就没有再拿奖学金了。但是关于计算机的基础学科,如数据结构,操作系统等等都可以拿到比较优秀的分数

你简历上有很多什么什么系统,那你可以说说哪个系统对你的成长最大

还是和之前一样,分成了对自己学习能力的提升和对项目的管理和团队管理两个方面来说

那你平时是怎么去解决问题的呢

Google,去论坛,找 issues,提 issues

一个输入框,对用户输入的内容进行匹配查找,你会怎么找

(当一个问题你一开始没有想法或者没有头绪的时候,先往自己熟悉的方面去带,这样有可能去到自己熟悉的地方,也可以为自己爆发想法带来一点点的时间)

我们工作室中的项目一般的做法是发送请求到后台,然后后台给我们返回查找到的列表。但是我们也可以使用 HTML5 的 Storage 来存储我们的数据,这样就可以省去一次请求了

那如果我们要兼容 IE6 呢

如果实在要兼容 IE6 的话,那也会很多兼容 Storage 的框架给我们调用

(但是显然不是面试官想要的结果,只是被我带过去 Web Storage 那边了,其实他想问的是数据结构,或查找,或排序)

我们想得太复杂了,就是数据已经在那里,你要怎么查找会更有效率

(我当时有两个想法,一条是打死不说快速查找的方法,例如二分查找这些,还有一个就是直接想一下之后说不清楚,反正都不会,我说二分查找出来,起码让他知道我了解过二分查找呀)

如果我们的数据是有序的话,我们可以使用二分查找等等高效的查找方法找

为什么要使用二分查找呢,他的时间复杂度是多少

使用二分查找可以每次比较后去掉一半的数据量,这样查找会更高效,但是时间复杂度我一时真的不清楚

那现在我们就来复习一下二分查找吧

我们都知道二分查找要在有序的序列的基础之上,所以在二分查找之前,肯定要排序的,这一题又问了排序,又问了查找呀。八大排序 之前已经总结过了,现在就让我们直接来看二分查找吧

其实二分查找的原理很简单,我们用 JavaScript 写一个最简单的实现

Array.prototype.binarySearch = function (low, high, key) {
  var mid = (low + high) / 2;
  return this[mid] > key ? this.binarySearch(low, mid - 1, key) :
         this[mid] < key ? this.binarySearch(mid + 1, high, key) :
         mid;
}

那时间复杂度是多少呢? O(logn)!

你对 ExtJS 很熟悉,那你有看到它的源码吗

看过部分吧,对 ExtJS 里的设计模式和继承印象比较深刻,然后就说了一下 JavaScript 里的继承,还有一些设计模式

主要说设计模式在 JavaScript 中的具体使用,讲了单例模式,观察者模式,工厂模式,原型模式等等,里面涉及到了一些 jQuery 源码和闭包

那你说说 JavaScript 里的闭包

讲了一下闭包的实例使用的例子,如保存私有变量还有函数式编程里的 Curry 和 Partial Application

那你再说说 JavaScript 中的 this

讲了一下 this 的四种调用场景

那你觉得 ExtJS 和 jQuery 两个设计的思想有什么不同

我就说了 jQuery 主要是方便了我们的 DOM 操作,它把我们所以的选择的元素或者是节点数组化,然后做统一的处理,例如添加样式,绑定事件等等。而 ExtJS 更重要的是组件化,它有很多很多组件给我们直接调用,可以让我们快速地开发出样式统一,兼容性好的应用

那现在就来总结一下 jQuery 和 ExtJS 的优缺点吧

jQuery

  • 强大的选择器
  • 数组化统一操作 DOM
  • 总是返回 jQuery 对象,允许链式操作
  • 语法简单而且体积小
  • MIT

ExtJS

  • 面向对象和组件化
  • 组件可直接使用,扩展性也好
  • 体积大
  • 不易于调试
  • 页面只有 <body> 标签,不利于 SEO
  • DOM 嵌套很深,对性能有一定影响
  • GPL

你有写过后台语言的代码吗?例如 PHP,C++ 这些

没有,只是会有一点点的 Node,写过一些小型的应用

那 Node 你是用什么框架呢

Express

那你知道 Node 异步编程的原理吗

讲了一下 callback,promise,还有 event loop

在科研团队里开发和在外面的公司开发有什么不一样

就说在科研团队里开发可能更加注重的是功能的实现,但是在外面公司的开发不仅仅要考虑这些,还要考虑性能,用户体验等等这些

那你说说你对性能优化的理解

还是性能,只要把减少请求,CDN,缓存控制的 HOW 和 WHY 搞清楚,就可以说得比较满意

(其实刚刚上一题还可以考虑安全,这样也可以把对安全的理解说出来)

你可以说说 stack 和 heap 的区别吗

我就说了 stack 是对静态资源分配的,heap 就是对动态资源进行分配的,例如一些类就是存储在 heap 中,而变量就是存储在 stack 里。

(但是面试官想要的还是数据结构)

我的意思是在编程的时候,什么时候用栈,什么时候用堆

(一片空白,说不下去) 哦哦,你说的是数据结构里的栈和堆是吧,不好意思,我对它们的使用场景不是很熟悉,只知道栈是后进先出…

总结一下 stack 和 heap 在数据结构的区别和适用场景

stack

  • 后进先出(LIFO)

heap

  • 经过排序后的树形结构
  • 存取是随意的

计算机中很容易使用栈的概念来实现递归,当执行一个函数的时候,就会把这个函数放在调用栈里,如果这时函数里要递归调用这个函数,为了获得这个函数的返回值,就要又把这个函数压在调用栈里执行,如此递归,当符合停止递归条件的时候,就依次返回,弹出调用栈,最后就执行栈底一开始调用的函数

除此之外,栈还可以实现数制的转换,符号的匹配还有前缀后缀表达式之类的转换

而堆则常常用于 堆排序

嗯嗯,你对前端的知识,还有设计模式都有都有了解,但是在这方面不是很熟悉呀

对呀,我也知道我对数据结构这部分的基础知识有所欠缺

好,那你最近在看什么书呢

没有说什么具体的一本书,最近我在学习 Shell Scripting,所以最近在看相关的资源

喔,为什么会想学 Shell 呢

因为最近在做一个自己的项目,写了一个 npm 的包,用来一条命令生成常用的项目结构。但是之前出了一个 bug,然后我找到 bin 里的时候,都看到了其他的 Shell 脚本,然后就有点兴趣,而且我也在用 Linux,学一下 Shell 也是很好处

最后面试官告知我,之前因为他出差了,所以现在才打电话来,但并不是笔试之后的电话面试,还属于内推的面试,但会结合笔试的成绩来考虑

32 分钟,三面结束,这次总结的重点是数据结构,我也知道我的数据结构和算法比较差,基础知识还是不能丢呀!之后在玩前端的同时,也要把基础知识巩固一下。