|
xx先后在twitter,Stripe工作,期间会参加面试工作。实际上参加面试工作的人都知道要想在一个较短的时间内(30min-1h)就对一个应聘者做出判断其实是很难的,因此我们不得不想尽办法去更加合理的去判断面试者。下面是xx理出的一个思路: 如果对方有github账号,我们会尽可能的去了解TA在开源项目上的动态和他的开源项目。我们也会从中挑出一些切入点,通过交流他做这个项目的出发点也能够更好的了解面试者的设计思路,也可以初步的去判断该人是不是适合团队。如果双方交流顺畅,接下来会直接进行到代码等一些基础问题上来。 自己的面试会很实际,几乎全部都是coding,很少会提到算法和一些抽象的概念。自己提出的问题看似简单,但是每一点都涉及到javascript的一些知识领域。 面试的时候并不建议使用白板,通常希望面试者自己带上自己的笔记本,或者就使用自己的。我会将他们的代码运行,并告知结果。 Object prototype 我起初会提出一个非常简单的问题就是定义一个函数spacify ,将一个字符串作为参数传入,然后返回一个字符串,不过该字符串相对原有传入参数的变化是字母与字母之间多了一个空格。 spacify('hello world') // => 'h e l l o w o r l d' 虽然问题很简单,但这却是一个很好的开始,我们接下来的问题便可以围绕此展开, 尤其对于那些声称自己了解Javascript,但实际却连一个函数都不会写的面试者高下立判。 正确的答案如下,不过一些面试者或许会选择for循环,当然这并没有错 function spacify(str) { return str.split('').join(' '); } 接下来,我会继续问如何将这个函数直接作用在一个字符串对象上. 'hello world'.spacify(); 这个问题可以让我了解面试者对原型链的理解,这个问题可以让彼此展开一些有讨论,诸如直接在原型链上定义属性的危害等等.实际期待结果: String.prototype.spacify = function(){ return this.split('').join(' '); }; 一般到这里我会让面试者讲讲函数声明和函数表达式的区别。 Arguments 接下来,我会去了解面试者对于 arguments的理解,我们会要求面试者定一个log函数。 log('hello world'); 函数类似实现一个简单的控制台输出,在控制台输出传入的字符串。一边面试者都会在定义的函数里直接写console.log,不过还是有更优秀的面试者会直接使用apply。 function log(msg){ console.log(msg); } 接下来,我会继续问如果我传入多个参数依旧输出一个字符串 ,我会提示面试者传入的 参数是不固定的,我会暗示xxconsole.log实际上也接受多个参数。 log('hello', 'world'); 不过我还是希望您的面试者现在已经想起apply;面试者可能会在apply和 call上困惑,这个时候我会做点小提示,不过将console上下文传入也是非常重要的. function log(){ console.log.apply(console, arguments); }; 接着我会继续追问,如果我希望在那个输出的字符串前统一加上(app) 这样的字符串,类似于这样: '(app) hello world' 这个问题明显会复杂很多,面试者应该知道arguments是一个伪数组,我们需要先将它转换成正常的数组,我们可以使用Array.prototype.slice,代码如下: function log(){ var args = Array.prototype.slice.call(arguments); args.unshift('(app)'); console.log.apply(console, args); }; Context 接下来我想了解面试者对于上下文以及this的理解,我会给出下边的代码,让面试者去解释count的值。 var User = { count: 1, getCount: function() { return this.count; } }; 接下来我会给出下面的代码,让面试者去回答应该输出的正确答案。 console.log(User.getCount());var func = User.getCount; console.log(func()); 上面的例子中正确输出1和undefined。实际上很多面试者都会在这里跌倒。func的上下文是 `window,因此已经失去了count属性。接下来我回继续追问面试者如何确保func的上下文始终都和User关联,这样可以使输出的答案是1。 (责任编辑:晨鸿) |


