5个典型的JavaScript面试练习

JavaScript开发人员在IT世界中有很高的需求。 如果这是最能表达您的知识的职位,那么您就有很多机会来更换您工作的公司并增加薪水。 但是在被公司录用之前,您必须证明自己的技能,才能通过面试过程。 在本文中,我将向您展示5个典型问题,要求他们进行前端工作以测试候选人的JavaScript技能及其相对解决方案。 那一定会很好玩!

问题1:范围

考虑以下代码:

(function() {
   var a = b = 5;
})();

console.log(b);

控制台上将打印什么?

回答

上面的代码显示5

这个问题的技巧是在IIFE中有两个赋值,但是变量a是使用关键字var声明的。 这意味着a是函数的局部变量。 相反,将b分配给全局范围。

这个问题的另一个技巧是在函数内部不使用严格模式'use strict'; )。 如果启用了严格模式 ,则代码将引发错误Uncaught ReferenceError:未定义b 请记住,严格模式要求您明确引用全局范围(如果这是预期的行为)。 因此,您应该写:

(function() {
   'use strict';
   var a = window.b = 5;
})();

console.log(b);

问题2:创建“本机”方法

String对象上定义一个repeatify函数。 该函数接受一个整数,该整数指定字符串必须重复多少次。 函数返回重复指定次数的字符串。 例如:

console.log('hello'.repeatify(3));

应该打印hellohellohello

回答

可能的实现如下所示:

String.prototype.repeatify = String.prototype.repeatify || function(times) {
   var str = '';

   for (var i = 0; i < times; i++) {
      str += this;
   }

   return str;
};

该问题测试开发人员有关JavaScript和prototype属性继承的知识。 它还验证开发人员能够扩展本机数据类型的功能(尽管不应这样做)。

这里的另一个重要点是证明您知道如何不覆盖可能的已定义函数。 这是通过在定义自己的函数之前测试该函数不存在来完成的:

String.prototype.repeatify = String.prototype.repeatify || function(times) {/* code here */};

当要求填充JavaScript函数时,此技术特别有用。

问题3:吊装

执行此代码的结果是什么,为什么。

function test() {
   console.log(a);
   console.log(foo());
   
   var a = 1;
   function foo() {
      return 2;
   }
}

test();

回答

该代码的结果是undefined2

原因是变量和函数都被吊起 (在函数顶部移动),但是变量不保留任何分配的值。 因此,在打印变量a ,它存在于函数中(已声明),但仍未undefined 换句话说,上面的代码等效于以下代码:

function test() {
   var a;
   function foo() {
      return 2;
   }

   console.log(a);
   console.log(foo());
   
   a = 1;
}

test();

问题4:如何this工程在JavaScript

以下代码的结果是什么? 解释你的答案。

var fullname = 'John Doe';
var obj = {
   fullname: 'Colin Ihrig',
   prop: {
      fullname: 'Aurelio De Rosa',
      getFullname: function() {
         return this.fullname;
      }
   }
};

console.log(obj.prop.getFullname());

var test = obj.prop.getFullname;

console.log(test());

回答

代码显示Aurelio De RosaJohn Doe 原因是JavaScript中的函数上下文(用this关键字引用)取决于函数的调用方式,而不是函数的定义方式。

在第一个console.log()调用中, getFullname()作为obj.prop对象的函数被调用。 因此,上下文引用后者,并且该函数返回此对象的fullname属性。 相反,将getFullname()分配给test变量时,上下文引用全局对象( window )。 发生这种情况是因为test被隐式设置为全局对象的属性。 出于这个原因,该函数返回一个称为window fullname的属性的值,在这种情况下,该属性是代码段第一行中设置的代码。

问题5: call()apply()

解决上一个问题,以便最后一个console.log()打印Aurelio De Rosa

回答

可以通过使用call()apply()函数强制函数的上下文来解决此问题。 如果您不了解它们及其区别,建议您阅读这篇文章function.call和function.apply有什么区别? 在下面的代码中,我将使用call()但在这种情况下apply()会产生相同的结果:

console.log(test.call(obj.prop));

结论

在本文中,我们讨论了采访中测试JavaScript开发人员的五个典型问题。 实际问题可能会因访谈而有所不同,但所涵盖的概念和主题通常非常相似。 希望您在测试知识方面玩得开心。 如果您不了解所有答案,请不要担心:没有什么是学习和经验无法解决的。

如果在面试中还被问到其他有趣的问题,请随时与我们分享。 它会帮助很多开发人员。

From: https://www.sitepoint.com/5-typical-javascript-interview-exercises/

你可能感兴趣的:(5个典型的JavaScript面试练习)