百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

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

sinye56 2024-10-26 14:34 6 浏览 0 评论

作者先后在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) {

接下来,我会继续问如何将这个函数直接作用在一个字符串对象上.

'hello world'.spacify();

这个问题可以让我了解面试者对原型链的理解,这个问题可以让彼此展开一些有讨论,诸如直接在原型链上定义属性的危害等等.实际期待结果:

String.prototype.spacify = function(){

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

Arguments

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

log

函数。
log('hello world');

函数类似实现一个简单的控制台输出,在控制台输出传入的字符串。一边面试者都会在定义的函数里直接写

console.log

,不过还是有更优秀的面试者会直接使用apply。
function log(msg){

接下来,我会继续问如果我传入多个参数依旧输出一个字符串 ,我会提示面试者传入的 参数是不固定的,我会暗示作者console.log实际上也接受多个参数。

log('hello', 'world');

不过我还是希望您的面试者现在已经想起

apply

;面试者可能会在

apply

call

上困惑,这个时候我会做点小提示,不过将

console

上下文传入也是非常重要的.
function log(){

接着我会继续追问,如果我希望在那个输出的字符串前统一加上

(app)

这样的字符串,类似于这样:
'(app) hello world'

这个问题明显会复杂很多,面试者应该知道

arguments

是一个伪数组,我们需要先将它转换成正常的数组,我们可以使用

Array.prototype.slice

,代码如下:
function log(){

Context

接下来我想了解面试者对于

上下文

以及

this

的理解,我会给出下边的代码,让面试者去解释

count

的值。
var User = {

接下来我会给出下面的代码,让面试者去回答应该输出的正确答案。

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

上面的例子中正确输出

1

undefined

。实际上很多面试者都会在这里跌倒。

func

的上下文是 `

window

,因此已经失去了

count

属性。接下来我回继续追问面试者如何确保

func

的上下文始终都和

User

关联,这样可以使输出的答案是1。

正确答案是使用

Function.prototype.bind

,代码如下:
var func = User.getCount.bind(User);

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

apply

call

有着较为深刻的理解。
Function.prototype.bind = Function.prototype.bind || function(context) {

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.

一个弹窗库

面试的最后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)

尾声

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

相关推荐

RHEL8和CentOS8怎么重启网络

本文主要讲解如何重启RHEL8或者CentOS8网络以及如何解决RHEL8和CentOS8系统的网络管理服务报错,当我们安装好RHEL8或者CentOS8,重启启动网络时,会出现以下报错:...

Linux 内、外网双网卡路由配置

1.路由信息的影响Linux系统中如果有多张网卡的情况下,如果路由信息配置不正确,...

Linux——centos7修改网卡名

修改网卡名这个操作可能平时用不太上,可作为了解。修改网卡默认名从ens33改成eth01.首先修改网卡配置文件名(建议将原配置文件进行备份)...

CentOS7下修改网卡名称为ethX的操作方法

?Linux操作系统的网卡设备的传统命名方式是eth0、eth1、eth2等,而CentOS7提供了不同的命名规则,默认是基于固件、拓扑、位置信息来分配。这样做的优点是命名全自动的、可预知的...

Linux 网卡名称enss33修改为eth0

一、CentOS修改/etc/sysconfig/grub文件(修改前先备份)为GRUB_CMDLINE_LINUX变量增加2个参数(net.ifnames=0biosdevname=0),修改完成...

CentOS下双网卡绑定,实现带宽飞速

方式一1.新建/etc/sysconfig/network-scripts/ifcfg-bond0文件DEVICE=bond0IPADDR=191.3.60.1NETMASK=255.255.2...

linux 双网卡双网段设置路由转发

背景网络情况linux双网卡:网卡A(ens3)和网卡B(...

Linux-VMware设置网卡保持激活

Linux系统只有在激活网卡的状态下才能去连接网络,进行网络通讯。修改配置文件(永久激活网卡)...

VMware虚拟机三种网络模式

01.VMware虚拟机三种网络模式由于linux目前很热门,越来越多的人在学习linux,但是买一台服务放家里来学习,实在是很浪费。那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有v...

Rocky Linux 9/CentOS Stream 9修改网卡配置/自动修改主机名(实操)

推荐...

2023年最新版 linux克隆虚拟机 解决网卡uuid重复问题

问题描述1、克隆了虚拟机,两台虚拟机里面的ip以及网卡的uuid都是一样的2、ip好改,但是uuid如何改呢?解决问题1、每台主机应该保证网卡的UUID是唯一的,避免后面网络通信有问题...

Linux网卡的Vlan配置,你可能不了解的玩法

如果服务器上连的交换机端口已经预先设置了TRUNK,并允许特定的VLAN可以通过,那么服务器的网卡在配置时就必须指定所属的VLAN,否则就不通了,这种情形在虚拟化部署时较常见。例如在一个办公环境中,办...

Centos7 网卡绑定

1、切换到指定目录#备份网卡数据cd/etc/sysconfig/network-scriptscpifcfg-enp5s0f0ifcfg-enp5s0f0.bak...

Linux搭建nginx+keepalived 高可用(主备+双主模式)

一:keepalived简介反向代理及负载均衡参考:...

Linux下Route 路由指令使用详解

linuxroute命令用于显示和操作IP路由表。要实现两个不同子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该...

取消回复欢迎 发表评论: