5个经典的前端面试问题,你行吗?
2014-10-09 20:18
691 查看
JavaScript开发人员在IT界的需求量一直很大。如果你非常精通神这门语言,你会有很多机会换工作,涨薪水。但是在一家公司录用你之前,你必须顺利通过面试,证明你的技能。在本文中,我将向您展示5个关于前端相关的问题,以测试侯选者的JavaScript技能和他们解决问题的能力。有将会非常有趣!
问题1:Scope作用范围
考虑下面的代码:
什么会被打印在控制台上?
回答
上面的代码会打印5。
这个问题的诀窍是,这里有两个变量声明,但a使用关键字var声明的。代表它是一个函数的局部变量。与此相反,b变成了全局变量。
这个问题的另一个诀窍是,它没有使用严格模式('usestrict';)。如果启用了严格模式,代码就会引发ReferenceError的错误:B没有定义(bisnotdefined)。请记住,严格模式,则需要明确指定,才能实现全局变量声明。比如,你应该写:
问题2:创建“原生”(native)方法
给字符串对象定义一个repeatify功能。当传入一个整数n时,它会返回重复n次字符串的结果。例如:
应打印hellohellohello。
回答
一个可能的实现如下所示:
现在的问题测试开发者有关JavaScript继承和prototype的知识点。这也验证了开发者是否知道该如果扩展内置对象(尽管这不应该做的)。
这里的另一个要点是,你要知道如何不覆盖可能已经定义的功能。通过测试一下该功能定义之前并不存在:
当你被要求做好JavaScript函数兼容时这种技术特别有用。
问题3:声明提升(Hoisting)
执行这段代码,输出什么结果。
回答
这段代码的结果是undefined和2。
原因是,变量和函数的声明都被提前了(移到了函数的顶部),但变量不分配任何值。因此,在打印变量的时候,它在函数中存在(它被声明了),但它仍然是undefined。表示换句话说,上面的代码等同于以下内容:
问题4:this在JavaScript中如何工作的
下面的代码会输出什么结果?给出你的答案。
回答
答案是AurelioDeRosa和JohnDoe。原因是,在一个函数中,this的行为,取决于JavaScript函数的调用方式和定义方式,而不仅仅是看它如何被定义的。
在第一个console.log()调用中,getFullname()被调用作为obj.prop对象的函数。所以,上下文指的是后者,函数返回该对象的fullname。与此相反,当getFullname()被分配到test变量时,上下文指的是全局对象(window)。这是因为test是被隐式设置为全局对象的属性。出于这个原因,该函数返回window的fullname,即定义在第一行的那个值。
问题5:call()和apply()
现在让你解决前一个问题,使最后的console.log()打印AurelioDeRosa。
回答
该问题可以通过强制使用call()或者apply()改变函数上下文。在下面我将使用call(),但在这种情况下,apply()会输出相同的结果:
结论
在这篇文章中,我们已经讨论了用来测试JavaScript开发者的五个经典问题。面试的概念和涵盖的主题通常是非常相似的。如果你不知道的一些问题的答案,不必担心:学习和经验可以慢慢积累。
如果你有其他一些有趣的问题,不要犹豫,与我们分享。它会帮助很多开发者。
问题1:Scope作用范围
考虑下面的代码:
(function(){ vara=b=5; })(); console.log(b);
什么会被打印在控制台上?
回答
上面的代码会打印5。
这个问题的诀窍是,这里有两个变量声明,但a使用关键字var声明的。代表它是一个函数的局部变量。与此相反,b变成了全局变量。
这个问题的另一个诀窍是,它没有使用严格模式('usestrict';)。如果启用了严格模式,代码就会引发ReferenceError的错误:B没有定义(bisnotdefined)。请记住,严格模式,则需要明确指定,才能实现全局变量声明。比如,你应该写:
(function(){ 'usestrict'; vara=window.b=5; })(); console.log(b);
问题2:创建“原生”(native)方法
给字符串对象定义一个repeatify功能。当传入一个整数n时,它会返回重复n次字符串的结果。例如:
console.log('hello'.repeatify(3));
应打印hellohellohello。
回答
一个可能的实现如下所示:
String.prototype.repeatify=String.prototype.repeatify||function(times){ varstr=''; for(vari=0;i<times;i++){ str+=this; } returnstr; };
现在的问题测试开发者有关JavaScript继承和prototype的知识点。这也验证了开发者是否知道该如果扩展内置对象(尽管这不应该做的)。
这里的另一个要点是,你要知道如何不覆盖可能已经定义的功能。通过测试一下该功能定义之前并不存在:
String.prototype.repeatify=String.prototype.repeatify||function(times){/*codehere*/};
当你被要求做好JavaScript函数兼容时这种技术特别有用。
问题3:声明提升(Hoisting)
执行这段代码,输出什么结果。
functiontest(){
console.log(a);
console.log(foo());
vara=1;
functionfoo(){
return2;
}
}
test();
回答
这段代码的结果是undefined和2。
原因是,变量和函数的声明都被提前了(移到了函数的顶部),但变量不分配任何值。因此,在打印变量的时候,它在函数中存在(它被声明了),但它仍然是undefined。表示换句话说,上面的代码等同于以下内容:
functiontest(){
vara;
functionfoo(){
return2;
}
console.log(a);
console.log(foo());
a=1;
}
test();
问题4:this在JavaScript中如何工作的
下面的代码会输出什么结果?给出你的答案。
varfullname='JohnDoe';
varobj={
fullname:'ColinIhrig',
prop:{
fullname:'AurelioDeRosa',
getFullname:function(){
returnthis.fullname;
}
}
};
console.log(obj.prop.getFullname());
vartest=obj.prop.getFullname;
console.log(test());
回答
答案是AurelioDeRosa和JohnDoe。原因是,在一个函数中,this的行为,取决于JavaScript函数的调用方式和定义方式,而不仅仅是看它如何被定义的。
在第一个console.log()调用中,getFullname()被调用作为obj.prop对象的函数。所以,上下文指的是后者,函数返回该对象的fullname。与此相反,当getFullname()被分配到test变量时,上下文指的是全局对象(window)。这是因为test是被隐式设置为全局对象的属性。出于这个原因,该函数返回window的fullname,即定义在第一行的那个值。
问题5:call()和apply()
现在让你解决前一个问题,使最后的console.log()打印AurelioDeRosa。
回答
该问题可以通过强制使用call()或者apply()改变函数上下文。在下面我将使用call(),但在这种情况下,apply()会输出相同的结果:
console.log(test.call(obj.prop));
结论
在这篇文章中,我们已经讨论了用来测试JavaScript开发者的五个经典问题。面试的概念和涵盖的主题通常是非常相似的。如果你不知道的一些问题的答案,不必担心:学习和经验可以慢慢积累。
如果你有其他一些有趣的问题,不要犹豫,与我们分享。它会帮助很多开发者。
相关文章推荐
- 5个经典的前端面试问题
- 5个经典的前端面试问题
- 5个经典的前端面试问题
- 5个经典的前端面试问题
- 【程序员面试】5个经典的前端面试问题
- 5个经典的JavaScript面试基础问题
- 前端面试最为经典的问题:输入URL到页面加载完成都发生了什么
- 5个经典的JavaScript面试基础问题
- 5个经典的JavaScript面试基础问题
- 前端面试经典问题:CSS中居中的几种方式
- 前端面试经典问题——css居中的几种方式
- 前端工作面试经典问题(超级全)
- 5个经典的javascript面试问题
- 非常经典又有趣的JavaScript面试5个问题
- 5个经典的JavaScript面试基础问题
- 面试技巧汇总:16个经典面试问题回答思路(转CSDN)
- 16个经典面试问题回答思路(转)
- 16个经典面试问题回答思路
- 面试中的16个经典问题
- 16个经典面试问题回答思路