「译」一篇非常不错的前端面试文章

2024-06-03 10:32

本文主要是介绍「译」一篇非常不错的前端面试文章,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自实验楼

作者先后在twitter,Stripe工作,期间会参加面试工作。实际上参加面试工作的人都知道要想在一个较短的时间内(30min-1h)就对一个应聘者做出判断其实是很难的,因此我们不得不想尽办法去更加合理的去判断面试者。下面是作者理出的一个思路:

如果对方有github账号,我们会尽可能的去了解TA在开源项目上的动态和他的开源项目。我们也会从中挑出一些切入点,通过交流他做这个项目的出发点也能够更好的了解面试者的设计思路,也可以初步的去判断该人是不是适合团队。如果双方交流顺畅,接下来会直接进行到代码等一些基础问题上来。

自己的面试会很实际,几乎全部都是coding,很少会提到算法和一些抽象的概念。自己提出的问题看似简单,但是每一点都涉及到JavaScript的一些知识领域。

面试的时候并不建议使用白板,通常希望面试者自己带上自己的笔记本,或者就使用自己的。我会将他们的代码运行,并告知结果。

1.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(' ');
};

一般到这里我会让面试者讲讲函数声明和函数表达式的区别。

2.Arguments

接下来,我会去了解面试者对于 arguments的理解,我们会要求面试者定一个log函数。

log('hello world');  

函数类似实现一个简单的控制台输出,在控制台输出传入的字符串。一边面试者都会在定义的函数里直接写console.log,不过还是有更优秀的面试者会直接使用apply。

function log(msg){  console.log(msg);
}

接下来,我会继续问如果我传入多个参数依旧输出一个字符串 ,我会提示面试者传入的 参数是不固定的,我会暗示作者console.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);
};

3.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。

正确答案是使用Function.prototype.bind,代码如下:

var func = User.getCount.bind(User);  
console.log(func());  

这个时候我会让面试者去进行完善,如果老的浏览器并不支持该方法,我们应该怎样去兼容。部分基础较差的面试者会比较纠结,但是个人认为任何一位前端工程师都应该对apply和call有着较为深刻的理解。

Function.prototype.bind = Function.prototype.bind || function(context) {  var self = this;return function(){ return self.apply(context,   arguments);};
}

Extra points if the candidate shims bind so that it uses the browser's native version if available. At this point, if the candidate is doing really well, I'll ask them to implement currying arguments.


4.一个弹窗库

面试的最后y一部分,我会要求面试者写点实际的东西。这个非常有用,足以了解前端的技术栈。如果前面的问题回答的较为理想,这个问题,我会非常迅速的展开最后一个问题的考察。

虽然最终效果取决于面试者的实现,但是这里依旧有足够的考察点。

最好不使用 position:absolute而是position:fixed,这个时候即使窗体有滚动,也可以很好的遮罩住全局。我会提示面试者这样使用,并且追问这两者的区别。

.overlay {position: fixed;left: 0;right: 0;  bottom: 0;  top: 0;  background: rgba(0,0,0,.8);
}

如何将里面的内容居中也是一个非常重要的考察点。一些面试者会使用绝对定位,而有的面试者则更擅长使用js。

.overlay article {position: absolute;  left: 50%;  top: 50%;  margin: -200px 0 0 -200px;  width: 400px;  height: 400px;
}

我会继续问,如何确保点击遮罩层时遮罩层是关闭的?这个问题可以将我们的讨论落脚到 冒泡中来。很多面试者都会直接将点击实践绑定到遮罩层上。

$('.overlay').click(closeOverlay);

这个接下来可以工作了,但是你会发现如果点击了遮罩层中的子元素,遮罩层也会关闭。解决方案是便是判断event target ,并且保证 这个时间不会冒泡。

$('.overlay').click(function(e){if (e.target == e.currentTarget)closeOverlay();
});

6.尾声

当然前面的知识点仅仅是前端的一部分,实际上你还可以问:性能,HTML5 APIs, AMD vs CommonJS modules,constructors,数据类型,以及盒子模型。我经常都会随着面试者的进行去选择相应的问题。

最后推荐大家都可以去看下:

  • Front-end-Developer-Interview-Questions(https://github.com/h5bp/Front-end-Developer-Interview-Questions)

  •  JavaScript Garden.(http://bonsaiden.github.io/JavaScript-Garden/zh/)

转载自:jackpu.com

文章地址:http://www.jackpu.com/-pian-fei-chang-bu-cuo-de-qian-duan-mian-shi-wen-zhang/

英文原文:http://blog.sourcing.io/interview-questions


这篇关于「译」一篇非常不错的前端面试文章的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026729

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

css渐变色背景|<gradient示例详解

《css渐变色背景|<gradient示例详解》CSS渐变是一种从一种颜色平滑过渡到另一种颜色的效果,可以作为元素的背景,它包括线性渐变、径向渐变和锥形渐变,本文介绍css渐变色背景|<gradien... 使用渐变色作为背景可以直接将渐China编程变色用作元素的背景,可以看做是一种特殊的背景图片。(是作为背

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

css实现图片旋转功能

《css实现图片旋转功能》:本文主要介绍了四种CSS变换效果:图片旋转90度、水平翻转、垂直翻转,并附带了相应的代码示例,详细内容请阅读本文,希望能对你有所帮助... 一 css实现图片旋转90度.icon{ -moz-transform:rotate(-90deg); -webkit-transfo

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代