12个AngularJS面试必备问题 *

最好的AngularJS开发人员和工程师可以回答的所有基本问题. 在我们社区的推动下,我们鼓励专家提交问题并提供反馈.

现在就雇佣一名顶尖的AngularJS开发人员
Toptal logo是顶级自由软件开发人员的专属网络吗, designers, finance experts, product managers, 和世界上的项目经理. 顶级公司雇佣Toptal自由职业者来完成他们最重要的项目.

Interview Questions

1.

列出至少三种使用AngularJS核心功能在应用模块之间进行通信的方法.

View answer

使用AngularJS核心功能在应用模块之间进行通信的常见方法包括:

  • Using services
  • Using events
  • By assigning models on $rootScope
  • 直接在控制器之间使用 $parent, $$childHead, $$nextSibling, etc.
  • 直接在控制器之间使用 ControllerAs, or other forms of inheritance
2.

应用程序模块之间的通信方式是易于测试的?

View answer

使用服务肯定很容易测试. 服务被注入,在测试中,可以使用真实的服务,也可以模拟它.

Events can be tested. 在单元测试控制器中,它们通常是实例化的. 为了测试$rootScope上的事件,它必须被注入到测试中.

针对任意模型的存在测试$rootScope是可测试的, 但是通过$rootScope共享数据并不是一个好的做法.

对于测试控制器之间的直接通信,可能应该模拟预期的结果. 否则,需要手动实例化控制器以获得正确的上下文.

3.

最流行的AngularJS端到端测试工具是Protractor. 也有其他的依靠类似的机制. 描述一下AngularJS应用的端到端测试是如何工作的.

View answer

端到端测试是针对一个正在运行的应用程序执行的,这是一个完全初始化的系统. 它们通常生成一个浏览器实例,并通过用户界面实际输入命令. 编写的代码由自动化程序评估,例如Selenium服务器(webdriver)。. 该程序向浏览器实例发送命令, 然后评估可见结果并向用户报告.

断言由另一个库处理,对于Protractor,默认是Jasmine. Before Protractor, 有一个模块叫Angular Scenarios, 通常是通过卡玛来执行的, and is now deprecated. 如果您想测试混合应用程序,可以使用另一个Selenium服务器,称为Appium.

Testing can be handled manually, 也可以委托给持续集成服务器, 无论是定制的还是特拉维斯提供的, SauceLabs, and Codeship.

申请加入Toptal的发展网络

并享受可靠、稳定、远程 自由职业者AngularJS开发者职位

Apply as a Freelancer
4.

这是为Protractor编写的一个简单测试,稍微修改了Protractor文档中的示例:

它('应该通过文本输入模型查找元素',function() {
  browser.get('/some-url');

  var login = element(by.model('username'));
  login.clear();
  login.sendKeys('Jane Doe');
  var name = element(by.binding('username'));
  expect(name.getText()).toEqual('Jane Doe');

  // Point A
});

解释代码是同步的还是异步的,以及它是如何工作的.

View answer

代码是异步的,尽管它是以同步方式编写的. 在幕后发生的事情是,所有这些函数都在控制流上返回承诺. 甚至可以使用“量角器”直接访问.promise.controlFlow() ",以及返回对象的两个方法".execute()” and “.await()”.

其他webdriver库,如wd http://github.需要直接使用回调或承诺链.

5.

当一个作用域终止时,将触发两个类似的“destroy”事件. 它们的用途是什么,为什么有两个?

View answer

第一个是AngularJS事件, “$destroy”, 第二个是jqLite / jQuery事件“$destroy”. 第一个可以被AngularJS作用域使用,只要它们是可访问的, 例如在控制器或链接函数中.

考虑下面两个发生在指令的postLink函数中的情况. The AngularJS event:

scope.$on(‘$destroy’, function () {
  // handle the destroy, i.e. clean up.
});

And

element.on(‘$destroy’, function () {
  // jQuery插件已经有了这个处理程序.
  // angular.element(document.body).off(‘someCustomEvent’);
});

每当删除节点时,jqLite / jQuery事件被调用, 如果不拆除范围,这可能会发生.

6.

如何重置“$timeout”,并禁用“$watch()”?

View answer

两者的关键都是将函数的结果赋值给一个变量.

To cleanup the timeout, just “.cancel()” it:

var customTimeout = $timeout(function () {
  // arbitrary code
}, 55);

$timeout.cancel(customTimeout);

同样适用于“$interval()”.

To disable a watch, just call it.

// .$watch()返回一个注销函数,我们将其存储到一个变量中
var deregisterWatchFn = $rootScope.$watch(' someGloballyAvailableProperty ', function (newVal) {
  if (newVal) {
    //我们调用注销函数来禁用手表
    deregisterWatchFn();
    ...
  }
});
7.

命名并描述指令定义函数执行的各个阶段, 或者描述指令是如何实例化的.

View answer

The flow is as follows:

首先,执行" $compile() "函数,它返回两个链接函数,preLink和postLink. 该函数对每个指令执行,从父指令开始,然后是子指令,然后是孙子指令.

其次,每个指令执行两个函数:控制器和prelink函数. 执行顺序还是从父元素开始,然后是子元素,然后是孙子元素,依此类推.

最后一个函数postLink以相反的顺序执行. 也就是说,它首先对孙辈执行,然后是子辈,然后是父级.

关于在AngularJS中如何处理指令的一个很好的解释可以在 AngularJS教程:揭秘自定义指令 post on the Toptal blog.

8.

How does interpolation, e.g. “{{ someModel }}”, actually work?

View answer

它依赖于$interpolation,一个由编译器调用的服务. 它计算可能包含AngularJS表达式的文本和标记. 对于每个插入的表达式,都会设置一个“watch()”. $interpolation返回一个函数,它只有一个参数" context ". 通过调用该函数并提供一个作用域作为上下文, 表达式是" $parse() " d.

9.

How does the digest phase work?

View answer

简而言之,在每个摘要周期中,将所有范围模型与其先前的值进行比较. That is dirty checking. 如果检测到更改,则触发该模型上设置的手表. 然后执行另一个摘要循环,以此类推,直到所有模型都稳定.

可能有必要提一下,没有“.$digest()” polling. 这意味着每次调用都是故意的. 只要使用了核心指令, we don’t need to worry, 但是,当外部代码更改模型时,需要手动调用摘要周期. Usually to do that, “.使用$apply() "或类似的,而不是".$digest()” directly.

10.

列出一些提高AngularJS应用性能的方法.

View answer

官方推荐的两种生产方法是禁用调试数据和启用严格的DI模式.

第一个可以通过$compileProvider来启用:

myApp.配置(function ($compileProvider) {
  $compileProvider.debugInfoEnabled(false);
});

该调整禁止向元素附加作用域,从而使控制台中无法访问作用域. 第二个可以设置为一个指令:


性能的提高在于注入的模块被显式地注释了, 因此不需要动态地发现它们.

您不需要自己注释,只需使用一些自动构建工具和库即可.

Two other popular ways are:

  • 尽可能使用一次性绑定. Those bindings are set, e.g. 在“{{::someModel}}”中,通过在模型前面加两个冒号进行插值. 在这种情况下,没有设置手表,并且在摘要期间忽略模型.
  • 使$httpProvider使用applyAsync:
myApp.配置(function ($httpProvider) {
  $httpProvider.useApplyAsync(true);
});

它只执行一次附近的摘要调用,使用零超时.

11.

What is $rootScope and how does it relate to $scope?

View answer

$rootScope is the parent object of all $scope 在网页中创建的Angular对象.

12.

What are the DOM and the BOM?

View answer

DOM是文档对象模型. It’s the view part of the UI. 我们在页面元素中所做的任何更改都会反映在DOM中.

BOM是浏览器对象模型,它指定了全局浏览器对象 window, localstorage, and console.

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

Why Toptal

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

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

现在就雇佣一名顶尖的AngularJS开发人员

我们的专属AngularJS开发者网络

想找一份AngularJS开发者的工作?

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

Apply as an AngularJS Developer

工作机会从我们的网络

Submit an interview question

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

* All fields are required

寻找AngularJS开发者?

Looking for AngularJS Developers? 看看Toptal的AngularJS开发者.

Jelena Drobnjakovic

Freelance AngularJS Developer
United StatesToptal Member Since December 7, 2015

Jelena作为一名前端开发人员已经活跃了大约8年. 她的工作包括日常使用HTML、CSS、JavaScript、Angular/Vue、jQuery、Laravel和Git. 她喜欢创建漂亮的网页,这些网页经过优化,可以在所有设备上顺利运行. Besides programming, 她还监督了一些项目的工作组织, which she loves doing. 同事之间的沟通是构建好的应用程序的关键.

Show More

Muhammed Mutahr

Freelance AngularJS Developer
United StatesToptal Member Since June 9, 2018

Muhammad是一名高级软件工程师,在公共教育部门(WSU), 私营医疗保健公司(Meridian), 汽车行业的财富500强上市公司(通用汽车 & AAM). Throughout his career, 他用HTML/CSS设计网页应用, 使用JavaScript框架(Angular/Ionic)开发客户端应用, 并使用Java和c#开发健壮的服务器端应用程序.

Show More

Thien Nguyen

Freelance AngularJS Developer
GermanyToptal Member Since October 6, 2020

Thien是一名专注于JavaScript和前端技术的专业软件工程师. Thien拥有超过15年的开发web应用程序的经验, websites, 以及使用各种技术和框架(包括Angular)的游戏, Angular Material, React (and other frameworks), Express, TypeScript, among others. 由于他的丰富经验涵盖了各个流程, project types, and platforms, you can trust Thien to deliver.

Show More

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

Join the Toptal community.

Learn more