JavaScript开发人员在IT世界中有很高的需求。 如果这是最能表达您的知识的职位,那么您就有很多机会来更换您工作的公司并增加薪水。 但是在被公司录用之前,您必须证明自己的技能,才能通过面试过程。 在本文中,我将向您展示5个典型问题,要求他们进行前端工作以测试候选人的JavaScript技能及其相对解决方案。 那一定会很好玩!
考虑以下代码:
(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);
在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函数时,此技术特别有用。
执行此代码的结果是什么,为什么。
function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}
test();
该代码的结果是undefined
和2
。
原因是变量和函数都被吊起 (在函数顶部移动),但是变量不保留任何分配的值。 因此,在打印变量a
,它存在于函数中(已声明),但仍未undefined
。 换句话说,上面的代码等效于以下代码:
function test() {
var a;
function foo() {
return 2;
}
console.log(a);
console.log(foo());
a = 1;
}
test();
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 Rosa
和John Doe
。 原因是JavaScript中的函数上下文(用this
关键字引用)取决于函数的调用方式,而不是函数的定义方式。
在第一个console.log()
调用中, getFullname()
作为obj.prop
对象的函数被调用。 因此,上下文引用后者,并且该函数返回此对象的fullname
属性。 相反,将getFullname()
分配给test
变量时,上下文引用全局对象( window
)。 发生这种情况是因为test
被隐式设置为全局对象的属性。 出于这个原因,该函数返回一个称为window
fullname
的属性的值,在这种情况下,该属性是代码段第一行中设置的代码。
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/