详解5个典型的 JavaScript 面试题
沉沙 2018-07-06 来源 : 阅读 573 评论 0

摘要:本篇JavaScript教程探讨了5个典型的 JavaScript 面试题,希望阅读本篇文章以后大家有所收获,帮助大家对JavaScript的理解更加深入。

在IT界,需要大量的 JavaScript 开发者。如果你的能力能够胜任这一角色,那么你将获得许多更换工作和提高薪水的机会。但是在你被公司录取之前,你需要展现你的技术实力,以便通过面试环节。在这篇文章中,我会为你展示前端面试会被问到的 5 个典型问题及相关解决方法,这 5 个问题常被用来测试面试者的 JavaScript 技能。它们很有意思! 

问题1: 范围(Scope)

思考以下代码:

(function() {    var a = b = 5;
})();    
console.log(b);

控制台(console)会打印出什么?

答案

上述代码会打印出 5 。

这个问题的陷阱就是,在立即执行函数表达式(IIFE)中,有两个命名,但是其中变量是通过关键词 var 来声明的。这就意味着 a 是这个函数的局部变量。与此相反, b 是在全局作用域下的。

这个问题另一个陷阱就是,在函数中他没有使用 “严格模式” ( 'use strict'; )。如果  严格模式 开启,那么代码就会报出未捕获引用错误(Uncaught ReferenceError):b没有定义。记住,严格模式要求你在需要使用全局变量时,明确地引用该变量。因此,你需要像下面这么写:

// 严格模式写法(function() {   'use strict';   var a = window.b = 5;
})();
console.log(b);

问题2: 创建 “原生(native)” 方法

在 String 对象上定义一个 repeatify 函数。这个函数接受一个整数参数,来明确字符串需要重复几次。这个函数要求字符串重复指定的次数。举个例子:

console.log('hello'.repeattify(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 */}

当你需要为旧浏览器实现向后兼容的函数时,这一技巧十分有用。

问题3: 变量提升(Hoisting)

执行以下代码会有什么结果?为什么?

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

答案

这段代码的执行结果是 undefined 和  2 。

这个结果的原因是,变量和函数都被提升了(hoisted)。因此,在 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 Rosa 和 John Doe 。原因是在 JavaScript 中,一个函数的上下文环境,也就是 this 关键词所引用对象,是依赖于函数是如何被调用的,而不是依赖于函数如何被定义的。

在第一个 console.log() 调用中,  getFullname() 是作为 obj.prop 的函数被调用的。因此,这里的上下文环境指向后者并且函数返回 this 对象的  fullname 属性。相反,当  getFullname() 被赋为 test 变量的值时,那个语境指向全局对象( window)。这是因为, test 被隐式设置为全局对象的属性。因此,函数调用返回 window 的 fullname 属性值,在此段代码中,这个值是通过第一行赋值语句设置的。

问题5:  call()  和  apply()

修复上一个问题,让最后一个 console.log() 打印出  Aurelio De Rosa 。

答案

要解决这个问题,可以通过为函数 call() 或者 apply() 强制函数调用的上下文环境。如果你不知道 call() 和 apply() 之间的区别,我推荐阅读文章“  function.call 和 function.apply 之间有和区别?” 。在以下代码中,我会用 call() ,但是在这里,用 apply() 也可以获得相同的结果:

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

结论

在这篇文章中,我们讨论了 JavaScript 面试者在面试中常被问到的 5 个典型问题。在实际面试中,真实的问题可能会有所不同,但涉及的概念和涵盖的话题通常是非常类似的。我希望你觉得前面那些测试很有趣。如果你不知道其中一些答案,也别担心:随着不断学习和经验 积累 ,你就能解决那些问题。

如果你在面试中被问到了其他有趣的问题,不要犹豫,马上来和我们分享吧。这会帮助到很多的开发者。

 

本文由职坐标整理发布,更多相关内容,请关注职坐标WEB前端JavaScript频道!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程