8 Essential Node.js面试问题 *

总源的基本问题认为最好的节点.Js开发人员和工程师可以回答这个问题. 在我们社区的推动下,我们鼓励专家提交问题并提供反馈.

Hire a Top Node.js Developer Now
Toptal logo是顶级自由软件开发人员的专属网络吗, designers, finance experts, product managers, 和世界上的项目经理. 顶级公司雇佣Toptal自由职业者来完成他们最重要的项目.

Interview Questions

1.

How does Node.Js处理子线程?

View answer

Node.本质上,j是a single thread process. 它不向开发人员公开子线程和线程管理方法. Technically, Node.js does 为某些任务(如异步I/O)生成子线程, 但它们在后台运行,不执行任何应用程序JavaScript代码, 也不要阻塞主事件循环.

如果在Node中需要线程支持.Js应用程序中,有一些工具可以启用它,例如 ChildProcess module. In fact, Node.Js 12有对线程的实验性支持.

2.

How does Node.Js支持多处理器平台,并充分利用了所有的处理器资源?

View answer

Since Node.js is by default a single thread application, 它将在单个处理器核心上运行,不会充分利用多个核心资源. However, Node.Js支持在多核系统上进行部署, 以便更好地利用硬件. The Cluster 模块是Node的核心之一.它允许运行多个Node.共享相同端口的Js工作进程.

3.

传递给Node的第一个参数通常是什么.js callback handler?

View answer

Node.js core modules, 以及大多数社区发布的, 遵循这样一种模式:任何回调处理程序的第一个参数都是可选的错误对象. 如果没有错误,参数将为空或未定义.

因此,典型的回调处理程序可以执行如下错误处理:

函数回调(err, results) {
    //通常我们会在处理结果之前检查错误
    if(err) {
        //以某种方式处理错误并返回
    }
    //没有错误,执行标准回调处理
}

申请加入Toptal的发展网络

并享受可靠、稳定、远程 Freelance Node.js Developer Jobs

申请成为自由职业者
4.

What is REPL? 它的用途是什么?

View answer

REPL代表(READ, EVAL, PRINT, LOOP). Node js自带捆绑的REPL环境. 这允许轻松创建CLI(命令行界面)应用程序.

5.

考虑下面的JavaScript代码:

console.log("first");
setTimeout(() => {
    console.log("second");
}, 0);
console.log("third");

The output will be:

first
third
second

假设这是期望的行为,我们还可以如何编写此代码呢?

View answer

Way back when, Node.js version 0.10 introduced setImmediate,等于 setTimeout(fn, 0),但有一些轻微的优势.

setTimeout (fn、延迟) 调用给定的回调函数 fn after the given delay 已消失(以毫秒计). However, 此时回调函数不会立即执行, 而是添加到函数队列中,以便执行 as soon as possible在所有当前正在执行和当前排队的事件处理程序完成之后. 将延迟设置为0将回调立即添加到队列中,以便在所有当前排队的函数完成后立即执行回调.

setImmediate(fn) 实现相同的效果,除了它不使用函数队列. 相反,它检查I/O事件处理程序队列. 如果当前快照中的所有I/O事件都已处理,则执行回调. 它在最后一个I/O处理程序之后立即将它们排队,有点像 process.nextTick. This is faster than setTimeout(fn, 0).

因此,上面的代码可以用Node编写.js as:

console.log("first");
setImmediate(() => {
    console.log("second");
});
console.log("third");
6.

在Node中解决未处理异常的首选方法是什么.js?

View answer

Node中未处理的异常.Js可以被抓住 Process 的处理程序 uncaughtException event.

process.on('uncaughtException', (err) => {
  console.log('捕获的异常:${err} ');
});

However, uncaughtException 是一种非常粗糙的异常处理机制,可以从Node.js in the future. 这个例外一直延续到 Process 级别意味着您的应用程序和Node.Js可能处于未定义状态,唯一明智的方法是重新启动一切.

首选的方法是在应用程序和Node之间添加另一层.Js进程,称为 domain.

域提供了一种将多个不同的I/O操作作为一个组处理的方法. So, 让你的应用程序, or part of it, 在单独的域中运行, 您可以安全地在域级别处理异常, 在他们到达 Process level.

然而,域名已经 pending deprecation 在Node之后的几年里.js 4. It’s possible 更经得起未来考验的方法是使用 zones.

7.

考虑下面的代码片段:

{
    console.time("loop");
    for (var i = 0; i < 1000000; i += 1){
        // Do nothing
    }
    console.timeEnd("loop");
}

在Google Chrome中运行此代码所需的时间远远超过在Google Chrome中运行所需的时间 Node.js. 解释为什么会这样,即使两者都使用v8 JavaScript引擎.

View answer

在web浏览器(如Chrome)中,声明变量 i 在任何函数的作用域之外使其成为全局的,因此将其绑定为 window object. 因此,在web浏览器中运行此代码需要反复解析该属性 i 在人口稠密的地区 window 类的每次迭代中的名称空间 for loop.

In Node.js, however, 声明任何函数作用域之外的变量只将其绑定到模块自己的作用域(而不是函数的作用域) window 对象),因此使其更容易和更快地解决.

同样值得注意的是,使用 let instead of var in the for 循环声明可以将循环的运行时间减少50%以上. 但这样的改变是假设你知道 两者的区别 let and var 以及这是否会对特定循环的行为产生影响.

8.

什么是“回调地狱”?如何避免它?

View answer

“回调地狱”指的是嵌套很重的回调,它们已经变得笨重或不可读.

下面是一个重度嵌套代码的例子:

查询("SELECT clientName='picanteverde';", function(id){
  查询(' SELECT * FROM transactions WHERE clientId=${id} ', function(transactions){
    transactions.each((transac) => {
      查询(' UPDATE transaction SET value = $.value*0.1} WHERE id=${交易.id}`, (error) => {
        if(!error){
          console.log("success!!");
        }else{
          console.log("error");
        }
      });
    });
  });
});

在某种程度上,修复回调地狱的主要方法是 modularization. 这些回调函数被分解成独立的函数,这些函数可以带一些参数调用. 因此,第一个改进级别可能是:

const logError = (error) => {
    if(!error){
      console.log("success!!");
    }else{
      console.log("error");
    }
  },
  updateTransaction = (t) => {
    查询(' UPDATE事务SET value = $.value*0.1} WHERE id=${t.id}, logError);
  },
  handleTransactions = (transactions) => {
    transactions.每个(updateTransaction);
  },
  handleClient = (id) => {
    查询(' SELECT * FROM transactions WHERE clientId=${id} ', handleTransactions);
  };

查询("SELECT clientName='picanteverde';",handleClient);

尽管这段代码更容易阅读, 我们还创建了一些以后可以重用的函数, 在某些情况下,使用形式更为健壮的解决方案可能更为合适 promises. 承诺允许额外的理想行为,如错误传播和链接. Node.Js包含对它们的本机支持.

此外,为回调地狱提供了一个更强大的解决方案 generators,因为它们可以解决不同回调之间的执行依赖关系. 然而,生成器要先进得多,使用它们来实现这个目的可能有些过分. 要了解有关生成器的更多信息,您可以从 this post.

然而,这些方法在这一点上是相当过时的. 目前的解决方案是 use async/await这是一种利用承诺的方法,最终使上图所示的所谓“厄运金字塔”变得平坦.

面试不仅仅是棘手的技术问题, 所以这些只是作为一个指南. 并不是每一个值得雇佣的“A”候选人都能回答所有的问题, 回答所有问题也不能保证成为A级考生. 一天结束的时候, 招聘仍然是一门艺术,一门科学,需要大量的工作.

Why Toptal

厌倦了面试候选人? 不知道该问什么才能让你得到一份好工作?

让Toptal为你找到最合适的人.

Hire a Top Node.js Developer Now

我们的独家节点网络.js Developers

希望找到一份Node的工作.js Developer?

让Toptal为你找到合适的工作.

Apply as a Node.js Developer

工作机会从我们的网络

提出面试问题

提交的问题和答案将被审查和编辑, 并可能会或可能不会选择张贴, 由Toptal全权决定, LLC.

*所有字段均为必填项

Looking for Node.js Developers?

Looking for Node.js Developers? 看看Toptal的Node.js developers.

David Mihal

Freelance Node.js Developer

United StatesFreelance Node.Toptal . js开发人员 Since January 8, 2017

大卫成年后一直在开发网站和网络应用程序. 作为一名软件工程师, 他曾在许多不同的软件公司工作过,从早期创业公司到谷歌. David对许多web框架和环境都很有经验, 但他特别喜欢使用Meteor进行开发.js. 他理解高质量代码的重要性,以及满足进度要求的必要性.

Show More

Rob Brown

Freelance Node.js Developer

United StatesFreelance Node.Toptal . js开发人员 Since January 31, 2018

Robert是一个非常积极的专业人士,拥有企业级的经验. 具有出色的沟通技巧和高度的专注力, 罗伯特有能力将大的想法从设计阶段转移到实现阶段. 作为一个全栈开发人员, 罗伯特运用广泛的技能和知识来解决手头的具体问题.

Show More

Justin Michela

Freelance Node.js Developer

United StatesFreelance Node.Toptal . js开发人员 Since June 26, 2018

Justin是一名技术专业人士,对学习充满热情,拥有18年以上领导团队构建企业级分布式应用程序解决现实问题的经验. 贾斯汀坚信,企业的各个方面都需要合作, 从开发到市场再到销售, 是成功的必要条件吗.

Show More

Toptal Connects the Top 3% 世界各地的自由职业人才.

加入Toptal社区.

Learn more